La question revient souvent sur le forum donc j’ai écris ce petit article concernant le passage de paramètre entre deux Form. Pour l’exemple j’ai utilisé le VB mais c’est facilement transposable en C#.
Prenons donc le cas d’une Form1 qui appelle une Form2(via un bouton). Form2 doit pouvoir modifier une variable définie dans Form1.
Première méthode : On passe une référence de la Form1 via le constructeur de la Form2
Le code de Form1:
' La variable concernée doit être déclarée Public.
Public variable As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
variable = 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Lors de l'instanciation de Form2, on passe la référence sur la Form1
Dim dial As New Form2(Me)
dial.ShowDialog()
MessageBox.Show(variable.ToString())
End Sub
End Class
Le code de Form2:
' L'objet Form1
Private frm As Form1
Public Sub New()
' Cet appel est requis par le concepteur.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
End Sub
' Le constructeur permettant le passage de la référence sur la Form1
Public Sub New(ByRef pfrm As Form1)
InitializeComponent()
frm = pfrm
frm.variable = 2
End Sub
End Class
L’avantage de cette méthode est qu’on peut avoir accès à d’autres variables ou méthodes de Form1 pour autant qu’elles soient définies comme étant Public. Par contre, il sera impossible d’appeler Form2 à partir d’une autre fenêtre.
Deuxième méthode : On passe via une propriété de Form2
Code de Form1:
Private locVariable As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
locVariable = 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dial As New Form2()
dial.Variable = locVariable
dial.ShowDialog()
MessageBox.Show(locVariable.ToString())
End Sub
End Class
Code de Form2:
Private frm As Form1
Private locVariable As Integer
Public Property Variable() As Integer
Get
Return locVariable
End Get
Set(ByVal value As Integer)
locVariable = value
End Set
End Property
Public Sub New()
' Cet appel est requis par le concepteur.
InitializeComponent()
End Sub
End Class
Troisième méthode : On passe la variable via le constructeur de Form2
Le code de Form1:
Private locVariable As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
locVariable = 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dial As New Form2(locVariable)
dial.ShowDialog()
MessageBox.Show(locVariable.ToString())
End Sub
End Class
Le code de Form2:
Private frm As Form1
Private locVariable As Integer
Public Sub New()
' Cet appel est requis par le concepteur.
InitializeComponent()
locVariable = 0
End Sub
Public Sub New(ByRef pVariable As Integer)
' Cet appel est requis par le concepteur.
InitializeComponent()
locVariable = pVariable
End Sub
End Class
L’avantage des deux dernières méthodes étant que Form2 peut-être appelée d’une autre fenêtre.