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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top