Fare parlare due form

martedì 10 aprile 2007 - 11.20

andreapavia Profilo | Senior Member

da form1 apro form2:

Dim form2 As New form2
form2 .Owner = Me
form2 .Show()


in form2 faccio una riverca con dei controlli....
una volta sezionato cio' che devo da form2 al click di un bottone
devo fare riempire due textbox di form1....


inizio click bottone form2


textbox1 di form1 = "mio testo"
textbox1 di form1 = "mio testo"


fine click bottone form2



come faccio ad accedere ai controlli di form1???????



alextyx Profilo | Expert

Ho giusto il link che fa per te!

http://forum.masterdrive.it/showthread.php?t=17291

Mi farebbe piacere che tu mi comunicassi anche le tue impressioni su quella paginetta, in modo da rendere più chiari i punti che già non lo sono abbastanza.

andreapavia Profilo | Senior Member

intanto grazie per la risposta

ma l'esempio che riporti permette di accedere alle propieta' dell'oggetto FORMCHEMIHAAPERTO...

in questo modo io non posso accedere hai controlli presenti nel form chiamante, posso solo accedere alle propieta' di FORMCHEMIHAAPERTO e non a

FORMCHEMIHAAPERTO.textboxchedevoriempire.text="ASTON MARTIN"


io devo potere rivalorizzare alcuni controlli contenuti nel padre.....

alextyx Profilo | Expert

Hai ragione. Sembra incredibile quanto non si vedono le cose finchè non si fanno testare a terzi!
Ho apportato le opportune precisazioni. Comunque la soluzione è dichiarare FormCheMiHaAperto o come la vuoi chiamare (anche il classico "pippo" va benissimo), del tipo adatto, cioè Form1. Grazie per il tuo contributo.

andreapavia Profilo | Senior Member

è verissimo!!!!

sta' di fatto che comuque a te occore una nuova istanza del form..... per cui perderesti tutti i parametri che gia' vi hai settato....

sub click botton form1

Dim form2 As New form2
form2.Owner = Me.FindForm
form2.Show()

fine sub


in form2 carico un dataset e lo associo a un DGV al
sub doppio click sul DGV

Private Sub DGV_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DGV.DoubleClick

Dim AAAA As String = DGV.DataSource.rows(DGV.CurrentRow.Index).item(0)
Dim BBBB As String = DGV.DataSource.rows(DGV.CurrentRow.Index).item(1)
Dim CCCC As String = DGV.DataSource.rows(DGV.CurrentRow.Index).item(2)

******* A QUESTO PUNTO ARRIVANO I PROBLEMI ******
SE SCRIVO

Me.Owner.Text = "ciao "

NEL FORM CHE CHIAMA FORM2 IL TEXT DIVENTA CIAO e TUTTO E' OK....

il mio problema è:
come faccio ad accedere
ai controlli di Me.Owner??????

Me.Owner.Controls(textbox1).text=AAAA
Me.Owner.Controls(textbox2).text=BBBB
Me.Owner.Controls(textbox3).text=CCCC

Me.Dispose()
Me.Close()
Me.Owner.refresh()

in questo modo catturo un'eccezione....
come si fa ad accere a textbox1,2,3 del form chiamante???

***********************************************
End Sub

GRAZIE 1000 E SCUSATEMI

alextyx Profilo | Expert

Abbi pazienza, non ho capito di quale form mi occorre una nuova istanza.
Di Form2, no, se ce l'ho già istanziato, al limite posso dargli Hide o Show, per farlo sparire e riapparire. L'importante è che mi ricordi di passargli il riferimento prima di cercare di scrivere nella textbox di Form1. La variabile che riceve il riferimento a Form1, cioè FormCheMiHaAperto, non è seguita da un New e quindi non si crea una nuova istanza di Form1.
Per avere nell'intellisense l'elenco dei vari controlli che stanno in form1, devi, o dichiarare come nel mio esempio una variabile di tipo adatto, oppure, nel tuo caso, dovresti procedere ad una conversione di tipo:

CType(Me.Owner, Form1).TextBox1.Text = "uuuu"

Altrimenti questo oggetto owner è di tipo sconosciuto e quindi anche l'intellisense non sa che pesci pigliare !


e.disanto Profilo | Junior Member

Scusa, presupponendo che il form chiamante si chiami form1, di seguito riporto il tuo codice:

Dim form2 As New form2
form2 .Owner = Me
form2 .Show()

da form2 hai provato a fare (ad esempio)

form1.nomecontrollo.text = "valore" ?

Ernesto di Santo

andreapavia Profilo | Senior Member

no.... mi scuso ma mi sono spiegato male io.....
dunque.... form1 cioe' il form padre, chiama form 2 e form2 va a scrivere alcuni valori in 3 textbox del padre:

CASO 1
FORM 2:

in form due dichiaro un form pubblico
Public FormCheMiHaAperto As Form


*****************************
IN FORM 1
SUB CLICK DI UN BOTTONE
Dim FORM2x As New FORM2
FORM2x .FormCheMiHaAperto = Me
FORM2x .Show()
END

******************************

TORNO IN FORM 2:
FACCIO CIO' CHE DEVO


FormCheMiHaAperto.Controls("TextBox1").Enabled = False

MI BECCO UN'ECCEZIONE.......

FormCheMiHaAperto.TEXT="CIAO"
funziona



CASO2


IN FORM 1
SUB CLICK DI UN BOTTONE

Dim FORM2xxx As New FORM2
FORM2xxx.Owner = Me.FindForm
FORM2xxx.Show()

FINE SUB

IN FORM 2

Me.Owner.Controls("TextBoxTraspRagSoc").Enabled = False
ECCEZIONE

Me.Owner.Text = "ciao "
FUNZIONA


........

dunque form1 istanzia un nuovo form2.... e form2 deve passare N stringhe, parametri o oggetti a form1 dopo avere fatto nuove elaborazioni....

form 2 non "DEVE E NON PUO" creare una NUOVA istanza di form1.... se facessi

dim fff as new form1

avrei accesso a tutti i controlli e che voglio.... ma non posso reistanziarlo, i dati sono gia' filtrati... se lo reistanziassi per assurdo farei farei una quantita immane di dataset (di cui ho gia' fatto il dispose ovviamente)


ma è form2 che deve poter scrivere nei controlli di FORM1


:::::::::::::::::::::::::::::::::::::::

form1.nomecontrollo.text = "valore"
NON PUO' FUNZIONARE PERCHE' FORM2 NON CONOSCE NULLA DI FORM1 VISTO CHE NON VIENE ISTANZIATO MA E' FORM1 A ISTANZIARE FORM2....




alextyx Profilo | Expert

>no.... mi scuso ma mi sono spiegato male io.....
>dunque.... form1 cioe' il form padre, chiama form 2 e form2 va
>a scrivere alcuni valori in 3 textbox del padre:
>
>CASO 1
>FORM 2:
>
>in form due dichiaro un form pubblico
>Public FormCheMiHaAperto As Form
>
>
>*****************************
>IN FORM 1
>SUB CLICK DI UN BOTTONE
> Dim FORM2x As New FORM2
> FORM2x .FormCheMiHaAperto = Me
> FORM2x .Show()
>END
>
>******************************
>
>TORNO IN FORM 2:
>FACCIO CIO' CHE DEVO
>
>
>FormCheMiHaAperto.Controls("TextBox1").Enabled = False
>
>MI BECCO UN'ECCEZIONE.......
>
>FormCheMiHaAperto.TEXT="CIAO"
>funziona
>
>
>
>CASO2
>
>
>IN FORM 1
>SUB CLICK DI UN BOTTONE
>
> Dim FORM2xxx As New FORM2
> FORM2xxx.Owner = Me.FindForm
> FORM2xxx.Show()
>
>FINE SUB
>
>IN FORM 2
>
> Me.Owner.Controls("TextBoxTraspRagSoc").Enabled = False
>ECCEZIONE
>
> Me.Owner.Text = "ciao "
>FUNZIONA
>
>
>........
>
>dunque form1 istanzia un nuovo form2.... e form2 deve passare
>N stringhe, parametri o oggetti a form1 dopo avere fatto nuove
>elaborazioni....
>
>form 2 non "DEVE E NON PUO" creare una NUOVA istanza di form1....
>se facessi
>
>dim fff as new form1
>
>avrei accesso a tutti i controlli e che voglio.... ma non posso
>reistanziarlo, i dati sono gia' filtrati... se lo reistanziassi
>per assurdo farei farei una quantita immane di dataset (di cui
>ho gia' fatto il dispose ovviamente)
>
>
>ma è form2 che deve poter scrivere nei controlli di FORM1
>
>
>:::::::::::::::::::::::::::::::::::::::
>
>form1.nomecontrollo.text = "valore"
>NON PUO' FUNZIONARE PERCHE' FORM2 NON CONOSCE NULLA DI FORM1
>VISTO CHE NON VIENE ISTANZIATO MA E' FORM1 A ISTANZIARE FORM2....
>
>
>
>
>

Perchè non vuoi provare a scrivere come ti ho suggerito?
Un comando del tipo:

CType(Me.Owner, Form1).TextBox1.Enabled = False

ti assicuro che funziona. Va incontro a come hai già impostato le cose e NON viene creata una nuova istanza di form1.

Quello che avviene è:

Quando il tuo codice, a runtime, passerà da qui :

Dim FORM2xxx As New FORM2
> FORM2xxx.Owner = Me.FindForm
> FORM2xxx.Show()

Form2 si vedrà assegnato Form1 come owner.

Però scrivi semplicemente:

FORM2xxx.Owner=Me

basta e avanza!

Quando invece scrivi il codice, in progettazione, il compilatore non sa chi sarà lo owner. Al limite, durante l'esecuzione del programma, potrebbero essere anche diversi form. Quindi, per far sì che il compilatore ti accetti l'input, deve sapere che textbox1 fa parte della collezione dei controlli di owner e questo lo sa soltanto se gli dici che il tipo di owner è Form1.
Prova a scrivere la riga come te l'ho postata e se non funziona ti pago da bere!

andreapavia Profilo | Senior Member

ho provato a seguire la tua indicazione tramiste il directcast

DirectCast(Me.Owner, FORM1).TextBoxPIPPO.Text = "funziona!!!!!!!"



ORA FUNZIONA TUTTO ALLA GRANDE.... LA TUA INDICAZIONE E' STATA TERRIBILMENTE PREZIOSA!!!!!!!!!!!!!!!!!!!!!!!!!!!

GRZAZIE 1000

alextyx Profilo | Expert

Allora paghi bere tu!
Il directcast è anche più 'riparmioso' se ricordo bene, solo che ha delle limitazioni di utilizzo e siccome non me le ricordo mai, uso sempre il ctype, ma ovviamente in questo caso va benissimo directcast.
Aggiornerò la mia paginetta con qualche esempio in più, compreso l'uso dell'owner, anche perchè è un sistema molto utilizzato e alla fin fine il problema di 'far parlare due form' come dici tu, è uno dei più gettonati.
Ciao e buon lavoro!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5