Zurück zum ersten Dialog
-
30-09-2019 - |
Frage
Ich habe eine WinForm, die als Dialog mit nur OK
und Cancel
Tasten verwendet wird. Also:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
dr = sr.ShowDialog
Ich habe ein If / Then zu sehen, ob der Benutzer auf OK gedrückt. Wenn sie OK gedrückt und es ist ein Fehler bei der Überprüfung, ich brauche sich zum Dialog zurückzukehren und es zu beheben.
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
Was würde ich in Case Windows.Forms.DialogResult.Cancel
setze mich nehmen rechts zurück zum ersten Dialog als sr.DialogResult = Windows.Forms.DialogResult.None
nicht zu funktionieren scheint?
Ich habe versucht, wieder das Ereignis Unter erhöhen (es ist ein Mausklick auf einem Menüpunkt), aber das funktioniert nicht mit der Technologie Ich verwende (VSTO Band).
Lösung
Versuchen Sie, Ihre Validierungslogik entweder in den Dialog selbst oder in einen Schließ Event-Handler für den Dialog zu bewegen. Letzteres könnte einfacher sein. Meine VB.NET Fähigkeiten sind praktisch inexistent mich so vergeben, wenn dies die Marke aus:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing
dr = sr.ShowDialog
Dann später:
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
Andere Tipps
Ich glaube, Sie müssen die in Ordnung (oder Ja NO usw.) und Abbrechen in Form selbst und nicht in der Nähe behandeln, wenn die Überprüfung fehlschlägt.
Auf dem Formular, das als Dialog verwendet wird, um die Klicken Sie auf Ereignisse von den Tasten zu handhaben müssen. Dann führen Sie einen Test in den Event-Handler zu entscheiden, ob das Formular geschlossen werden soll. Ist dies der Fall, dann können Sie den Dialog auf, was Sie brauchen, und führen Me.close ()
Siehe hier für ein Beispiel
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
Seit seiner VSTO und Sie haben ein Problem „normale“ Mittel zu verwenden, um zwischen den Anzeigen zu kommunizieren, warum nicht Sie versuchen, pinvoke zu verwenden, anstatt: Angenommen, Sie wissen, wie der HWNDs von Subjekt Fenstern zu erhalten, verwenden Sie diesen Code:
[DllImport("user32.dll")]
public static extern bool SetFocus(IntPtr hwnd);
Wie Preet vorgeschlagen ist es imho direkteste die ‚Me.close‘ Erklärung der Schaltfläche Ereignisse zu behandeln.
Sie können dies auch tun, indem sie von der Schaltfläche Ereignishandler zu entfernen und das Formular in Ihrem Logikbaum schließt später. In meinem Beispiel habe ich zwei Formen. Form1 verfügt über eine Taste Form2 zu öffnen und dass man zwei Tasten mit Schaltflächen OK und Abbrechen. So auf dem zweiten Formular können Sie den folgenden verwenden:
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
Sie sollten bedenken, dass bei der Verwendung der Showdialog die Form nie entsorgt wird, es sei denn Sie es ausdrücklich nennen. Ein einfaches Ja / Nein Beispiel zu fragen, ob der Benutzer sicher zu schließen.
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
Die Button2_Click Unter wird rekursiv aufgerufen, so lange zu halten, die Anzeige als OK in der zweiten Form und NO in der folgenden Messagebox gewählt wird. Ich hoffe, das hilft.