Ritorna alla prima finestra di dialogo
-
30-09-2019 - |
Domanda
Ho un WinForm che viene utilizzato come una finestra di dialogo con i pulsanti OK
e Cancel
. Quindi:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
dr = sr.ShowDialog
Ho un If / Then per vedere se l'utente preme OK. Se hanno premuto OK e v'è un errore di convalida, ho bisogno di loro di tornare alla finestra di dialogo e risolvere il problema.
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
Che cosa avrei messo in Case Windows.Forms.DialogResult.Cancel
di portarmi a destra di nuovo alla prima finestra di dialogo come sr.DialogResult = Windows.Forms.DialogResult.None
non sembra funzionare?
Ho provato alzando di nuovo il sub evento (si tratta di un clic da una voce di menu), ma questo non funziona con la tecnologia che sto utilizzando (VSTO del nastro).
Soluzione
Provare a spostare la logica di convalida sia nella finestra stessa, o in un gestore di eventi di chiusura per la finestra di dialogo. Il secondo potrebbe essere più facile. Le mie competenze VB.NET sono praticamente inesistenti quindi perdonatemi se questo è fuori luogo:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing
dr = sr.ShowDialog
Poi più tardi:
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
Altri suggerimenti
Penso che è necessario per gestire il ok (o Sì NO, ecc) e la cancellazione in forma in sé e non vicino, se la convalida non riesce.
Nel modulo che viene utilizzato come una finestra di dialogo è necessario gestire eventi Click dei pulsanti. Quindi eseguire un test nel gestore di eventi per decidere se il modulo dovrebbe essere chiuso. Se è così allora è possibile impostare il DialogResult a tutto ciò che è necessario ed eseguire Me.Close ()
qui per un esempio
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
Dal suo VSTO e si hanno problemi ad usare "normali" mezzo per comunicare tra le schermate, Perché non si tenta di utilizzare PInvoke invece: Dato si sa come ottenere i hWnds di finestre oggetto di questo codice:
[DllImport("user32.dll")]
public static extern bool SetFocus(IntPtr hwnd);
Come Preet suggerito è imho più semplice per gestire l'affermazione 'Me.Close' dagli eventi dei pulsanti.
Si può anche fare questo rimuovendolo dal gestore di eventi pulsante e chiudere il modulo nella albero logico seguito. Nel mio esempio ho due forme. Form1 ha un pulsante per aprire Form2 e che uno ha due pulsanti con pulsanti OK e Annulla. Quindi, nella seconda maschera è possibile utilizzare il seguente:
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
Si dovrebbe tenere a mente che quando si usa lo ShowDialog il modulo non viene mai eliminato a meno che non si chiama specificatamente per esso. Un semplice Sì / No esempio per chiedere se l'utente vuole chiudere con certezza.
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
Il sub Button2_Click è chiamata in modo ricorsivo per mantenere la visualizzazione finché OK viene scelto nel secondo modulo e non nei seguenti Messagebox. Spero che questo aiuta.