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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top