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).

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top