Volver a la primera de diálogo
-
30-09-2019 - |
Pregunta
Tengo un WinForm que se utiliza como un diálogo con sólo botones OK
y Cancel
. Por lo tanto:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
dr = sr.ShowDialog
Tengo un If / Then para ver si el usuario pulsa OK. Si se pulsa OK y hay un error de validación, los necesito para volver al cuadro de diálogo y solucionarlo.
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é iba a poner en Case Windows.Forms.DialogResult.Cancel
que me lleve de vuelta a la primera de diálogo como no parece estar funcionando sr.DialogResult = Windows.Forms.DialogResult.None
?
He intentado elevar la sub evento de nuevo (que es un clic de una opción de menú), pero esto no funciona con la tecnología que estoy usando (cinta VSTO).
Solución
Trate de mover la lógica de validación, ya sea en el mismo o en un controlador de eventos para el cierre de diálogo de diálogo. Este último podría ser más sencillo. Mis habilidades VB.NET son prácticamente inexistentes así que perdónenme si se trata de la marca:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing
dr = sr.ShowDialog
A continuación, más adelante:
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
Otros consejos
Creo que se necesita para manejar el bien (o Sí NO etc) y cancelar en forma en sí y no cerca que si falla la validación.
En el Formulario que se utiliza como un diálogo que necesita para manejar los Haga clic en Eventos de los botones. A continuación, ejecute una prueba en el controlador de eventos para decidir si el formulario debe ser cerrado. Si lo hace entonces se puede establecer el DialogResult a lo que usted necesita y ejecutar Me.Close ()
aquí para un ejemplo
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
Desde su VSTO y está teniendo problemas para utilizar medios "normales" para comunicarse entre pantallas, ¿por qué no intenta utilizar PInvoke en su lugar: Dado que sabe cómo obtener los HWNDs de ventanas, expuesto utilizar este código:
[DllImport("user32.dll")]
public static extern bool SetFocus(IntPtr hwnd);
Como Preet sugirió que en mi humilde opinión es más sencillo de manejar la declaración 'Me.Close' de los eventos de botón.
También puede hacer esto mediante la eliminación del controlador de eventos botón y cerrar el formulario en su árbol lógico después. En mi ejemplo, tengo dos formas. Form1 tiene un botón para abrir Form2 y que uno tiene dos botones con los botones Aceptar y Cancelar. Así que en la segunda forma se puede utilizar lo siguiente:
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
Se debe tener en cuenta que cuando se utiliza el ShowDialog la forma no se dispone de menos que llame específicamente para él. Un simple Sí / No ejemplo para preguntar si el usuario quiere cerrar con seguridad.
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
El sub Button2_Click se llama de forma recursiva para mantener a mostrar, siempre y cuando se elige Aceptar en la segunda forma y NO en la siguiente Messagebox. Espero que esto ayude.