J'ai un formulaire "frmOptions" avec une zone de texte nommée "txtMyTextValue" et un bouton nommé "btnSave" pour enregistrer et fermer le formulaire lorsqu'il est cliqué,
alors, je montre cette forme de dialogue "frmOptions" quand un bouton "btnOptions" est cliqué sur la forme principale "frmMain", comme ceci
Private Sub btnOptions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOptions.Click
ShowOptionsForm()
End Sub
Private Sub ShowOptionsForm()
Dim options = New frmOptions
options.ShowDialog()
End Sub
Comment puis-je obtenir dans le formulaire principal "frmMain" la valeur insérée dans la zone de texte "txtMyTextValue" lorsque l'utilisateur clique sur "btnSave"?
Vous souhaitez capturer les informations à partir de la boîte de dialogue uniquement si le résultat est OK
(l'utilisateur appuie sur Save
au lieu de Cancel
ou ferme la boîte de dialogue d'une autre manière), procédez comme suit:
Private Sub ShowOptionsForm()
Dim options = New frmOptions
' Did the user click Save?
If options.ShowDialog() = Windows.Forms.DialogResult.OK Then
' Yes, so grab the values you want from the dialog here
Dim textBoxValue As String = options.txtMyTextValue.Text
End If
End Sub
Maintenant, à l'intérieur de votre formulaire de dialogue, vous devez définir le résultat Windows.Forms.DialogResult.OK
lorsque l'utilisateur clique sur le bouton correspondant à l'action OK
du formulaire de dialogue, comme suit:
Public Class frmOptions
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
' Set the result to pass back to the form that called this dialog
Me.DialogResult = Windows.Forms.DialogResult.OK
End Sub
End Class
Vous pouvez utiliser Events pour s’occuper de cela. Avec cette approche, le formulaire de configuration ne doit pas nécessairement être modal et l'utilisateur peut cliquer sur le bouton Enregistrer à tout moment.
Dans les options:
'You can expand the signature to take more than just a single String.
Friend Event SavedOptions(ByVal strData As String)
Private Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
RaiseEvent SavedOptions(txtMyTextValue.Text)
End Sub
Dans frmain:
Private Sub ShowOptionsForm()
Dim options = New frmOptions
AddHandler options.SavedOptions, AddressOf OnOptionsSave
options.ShowDialog()
End Sub
Private Sub OnOptionsSave(ByVal strData As String)
'Or whatever you want to do on frmMain with Options Data.
MsgBox(strData)
End Sub
La méthode la plus simple consiste à ajouter une propriété publique au formulaire frmOptions qui renvoie une chaîne interne déclarée au niveau global de frmOptions.
Dim strValue As String
Public Property MyStringValue() As String
Get
Return strValue
End Get
End Property
Ensuite, lorsque votre utilisateur clique sur le bouton OK pour confirmer ses choix, vous copiez la valeur de la zone de texte dans la variable interne.
Private Sub cmdOK_Click(sender As Object, e As System.EventArgs) Handles cmdOK.Click
strValue = txtMyTextValue.Text
End Sub
Enfin dans le frmMain vous utilisez un code comme celui-ci pour récupérer la valeur insérée
Private Sub ShowOptionsForm()
Using options = New frmOptions()
if DialogResult.OK = options.ShowDialog() Then
Dim value = options.MyStringValue
End If
End Using
End Sub
Je préfère éviter l'accès direct aux contrôles internes de frmOptions, une propriété offrant un indirection pouvant être utilisée pour mieux valider les entrées fournies par votre utilisateur.
Vous pouvez accéder à la valeur à partir de l'instance frmOptions. Cependant, cela enfreint la loi de Demeter.
Vous devez exposer la valeur avec une propriété dans votre classe . Classe publique frmOptions
Public ReadOnly Property MyTextValue As String
Get
Return Me.txtMyTextValue.Text
End Get
End Property
Classe de fin
Ensuite, vous pouvez accéder à la valeur:
Private Sub ShowOptionsForm()
Dim options = New frmOptions
Dim frmOptionTextValue As String
Dim frmOptionsDiagResult As DialogResult
frmOptionsDiagResult = options.ShowDialog()
If frmOptionsDiagResult = Windows.Forms.DialogResult.OK Then
frmOptionTextValue = options.MyTextValue
Else
'...
End If
End Sub
Enfin, si vous utilisez une boîte de dialogue, assurez-vous de définir le résultat de la boîte de dialogue pour le bouton.