Retour à la première boîte de dialogue
-
30-09-2019 - |
Question
J'ai un WinForm qui est utilisé comme une boîte de dialogue avec seulement boutons OK
et Cancel
. Donc:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
dr = sr.ShowDialog
J'ai un If / Then pour voir si l'utilisateur a appuyé sur OK. S'ils ont pressé OK et il y a une erreur de validation, je les ai besoin de revenir à la boîte de dialogue et de le corriger.
If dr = Windows.Forms.DialogResult.OK Then
Dim mr As Windows.Forms.DialogResult
mr = MsgBox("Click Yes to fix, No to not fix or Cancel to go " + vbCrLf + _
" back to the dialog to fix.", MsgBoxStyle.YesNoCancel)
Select Case mr
Case Windows.Forms.DialogResult.Yes
''# something
Case Windows.Forms.DialogResult.No
''# something more
Case Windows.Forms.DialogResult.Cancel
''# RIGHT HERE is where I'm having the problem.
''# I just want "Cancel" to return to the first dialog.
sr.DialogResult = Windows.Forms.DialogResult.None
End Select
Else
''#other thing
End If
Qu'est-ce que je mettrais en Case Windows.Forms.DialogResult.Cancel
me replongent dans la première boîte de dialogue comme sr.DialogResult = Windows.Forms.DialogResult.None
ne semble pas fonctionner?
Je l'ai essayé élever le sous-événement nouveau (c'est un clic d'un élément de menu), mais cela ne fonctionne pas avec la technologie que je utilise (VSTO ruban).
La solution
Essayez de déplacer votre logique de validation soit dans la boîte de dialogue lui-même, ou dans un gestionnaire d'événements de clôture de la boîte de dialogue. Ce dernier pourrait être plus facile. Mes compétences en VB.NET sont pratiquement inexistants alors pardonnez-moi si cela est hors de la marque:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing
dr = sr.ShowDialog
Puis, plus tard:
Public Sub SlideRangeDialog_Closing(Sender As Object, e As CancelEventArgs)
' cast Sender as a SlideRangeDialog and check its
' DialogResult property to see if they clicked OK.
' Your validation goes in here.
' If anything fails validation, set e.Cancel to True and the
' dialog won't close.
End Sub
Autres conseils
Je pense que vous devez gérer l'ok (ou NO Oui, etc) et d'annuler sous la forme elle-même et pas le fermer si la validation échoue.
Sur le formulaire qui est utilisé comme une boîte de dialogue vous devez gérer les événements Cliquez sur des boutons. Ensuite, exécutez un test dans le gestionnaire d'événement pour décider si la forme doit être fermée. Si elle ne vous pouvez alors régler le DialogResult à tout ce dont vous avez besoin et exécuter Me.Close ()
Private Sub OKCmd_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles OKCmd.Click
If Not ____do_your_test_here____ Then
MsgBox("Cannot press OK because of blah blah blah . Try again.", MsgBoxStyle.Exclamation)
Else
Me.DialogResult = DialogResult.OK
Me.Close()
End If
End Sub
Depuis sa VSTO et vous rencontrez des problèmes d'utilisation « normale » des moyens de communication entre les écrans, pourquoi ne pas vous essayez d'utiliser PInvoke à la place: Étant donné que vous savez comment obtenir les hwnds des fenêtres de sujet en utilisant ce code:
[DllImport("user32.dll")]
public static extern bool SetFocus(IntPtr hwnd);
Comme il est suggéré Preet AMHA plus simple de gérer la déclaration « Me.Close » des événements de bouton.
Vous pouvez aussi le faire en le retirant du gestionnaire d'événements de bouton et la fermeture de la forme dans votre arbre logique plus tard. Dans mon exemple, j'ai deux formes. Form1 a un bouton pour ouvrir Form2 et que l'on a deux boutons avec boutons OK et Annuler. Donc, la deuxième forme, vous pouvez utiliser les éléments suivants:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.DialogResult = Windows.Forms.DialogResult.OK
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.DialogResult = Windows.Forms.DialogResult.Cancel
Me.Dispose()
End Sub
Vous devriez garder à l'esprit que lorsque vous utilisez la ShowDialog du formulaire est jamais disposé à moins que vous appelez spécifiquement pour elle. Un simple Oui / Non exemple pour demander si l'utilisateur veut fermer sûr.
If Form2.ShowDialog = Windows.Forms.DialogResult.OK Then
Select Case MessageBox.Show("Sure to close?", "Warning", MessageBoxButtons.YesNo)
Case Windows.Forms.DialogResult.Yes
Form2.Dispose()
Case Windows.Forms.DialogResult.No
Button2_Click(sender, e)
End Select
End If
Le sous Button2_Click est appelé récursive de garder l'affichage tant que OK est choisi dans la deuxième forme et dans le NO Messagebox suivant. J'espère que cela aide.