Passaggio del valore di una variabile da un form all'altro

mercoledì 22 agosto 2007 - 15.10

Giovanni_3478 Profilo | Senior Member

Ciao

Ho un problema simile a questo
http://www.dotnethell.it/forum/messages.aspx?ThreadID=9806

Ho un form mdi MDIParent1
in cui ho un valore di una variabile string STR.

Ad un punto del codice di MDIParent1, ho:
form2.show()
All'interno del form2 devo usare la variabile STR.
Come posso fare?

La soluzione data nell'altro post era:
Hai molte vie per aggirare il problema:

1) Rendere accessibile il form grande dichiarandolo pubblico in un modulo
2) Passare un riferimento del form grande al form piccolo, tipicamente in un overload del costruttore, ma non necessariamente.
3) Assegnare ad una variabile globale di tipo Form, un riferimento al form grande, prima di istanziare il form piccolo, che potrà usare tale variabile per accedere al form grande
4) Usare il metodo showdialog per lanciare il form piccolo e dopo il ritorno al codice del form grande, leggerne i valori, aggiornare il controllo che hai sul form grande e poi distruggere il form piccolo, come mostrato sotto:

Dim Fp as new Fpiccolo

'Lanci FP e ci lavori sopra. Alla fine dovrai settare la sua proprietà DialogResult, per esempio a DialogResultOK
provocandone la chiusura, che però è una chiusura un po' diversa da quella dei form aperti col metodo 'Show'
Fp.showdialog()

' Qui leggi i valori in Fp e aggiorni il controllo.
MiaProceduraCheAggiornaDati() 'Nota che a questo punto puoi ancora accedere ai controlli di FP ( es: Fp.Textbox1) e leggerne il contenuto

' Poi distruggi l'oggetto
Fp.dispose
Fp=nothing

'Ora non puoi più accedere a FP

La 4 mi sembra non fa al caso mio.
Le prime 3: potete farmi degli esempi? (VB.net 2.0)

SSUPERPIPPO Profilo | Guru

>Ho un form mdi MDIParent1
>in cui ho un valore di una variabile string STR.

>Ad un punto del codice di MDIParent1, ho:
>form2.show()
>All'interno del form2 devo usare la variabile STR.
>Come posso fare?

Basta che dichiari la variabile come Public in un modulo

se non vuoi rendere la variabile pubblica allora puoi utilizzare un oggetto Textbox per contenere il dato

Io di solito faccio così:

1. Dichiaro un oggetto di tipo TextBox nel form mdi MDIParent1

Dim Comodo as new TextBox

2. Dichiaro una variabile di tipo Textbox pubblica nel form2

Public TxtComodo as TextBox

3. Prima di richiamare il metodo show dal form mdi, assegna alla variabile del Form2 l'oggetto che hai creato

form2.TxtComodo=Comodo
form2.Show

In questo modo, quando tu apri form2 passi direttamente l'oggetto che hai creato il cui valore, se aggiornato, lo ritroverai anche alla chiusura di form2.

Ci sono altri metodi, ma credo che così risolvi...

Fammi sapere, ciao

Alessandro

Giovanni_3478 Profilo | Senior Member

Ciao

Ho provato col passaggio di valori come nel tuo esempio

MDIParent1
Dim Comodo As New String("")
......
Me.Comodo = Me.DbTempName_e_Path
.......
Form2.TxtComodo = Comodo
Form2.Show()


FORM2
Public TxtComodo As String

ma la variabile TxtComodo è sempre uguale a nothing

Ho provato anche con una variabile pubblica nel MDIParent1
e a richiamarla dal Form2 (MDIParent1.nome_variabile);
ho provato creando una proprietà,
ma il problema che una volta andati in Form2, la variabile diventa nothing.

Non riesco a capire come mai

xe Profilo | Newbie

Penso ti convenga inserire una proprietà nell'MDI form che restituisca la stringa aggirando così il problema dei riferimenti mancanti nel caso di aggiornamenti in altre form dovuti alla natura di oggetto immutabile della string.
Sfruttando la proprietà, e non campi pubblici dovresti nelle form secondarie non dovresti incorrere nel problema menzionato.
Se devi fare lo stesso con più variabili stai di meno a scrivere al volo un piccolo wrapper da istanziare nel MDI.


Deligere oportet quem velis diligere

Giovanni_3478 Profilo | Senior Member

Ho provato anche con la variabile

Quando vado nel form2
tutte le variabili e anche le proprietà risultano essere nothing.

xe Profilo | Newbie

detta così nn saprei dove andare a parare...anche perché dovrebbero esser threadsafe
giusto per sicurezza...quando invochi il metodo Show passagli l'istanza MDI e setta MDIParent....presumo tu lo faccia già, ma non essendo presente nel codice che hai postato...bhe nn credo sia la soluzione, ma m era venuto il dubbio.

Deligere oportet quem velis diligere

Giovanni_3478 Profilo | Senior Member

Ciao

Avevo fatto un errore
Public Class Form2

Public cnn1 As SqlClient.SqlConnection
*** Volevo richiamare l'MDIParent qui con MDIParent1.nomeproprietà****

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
....***Invece lo devo richiamare qui ***
End Sub

Grazie a te e a tutti


Ciao
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5