Question

J'ai un WinForm qui est utilisé comme une boîte de dialogue avec seulement boutons OK et Cancel. Donc:

Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
dr = sr.ShowDialog

J'ai un If / Then pour voir si l'utilisateur a appuyé sur OK. S'ils ont pressé OK et il y a une erreur de validation, je les ai besoin de revenir à la boîte de dialogue et de le corriger.

    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'est-ce que je mettrais en Case Windows.Forms.DialogResult.Cancel me replongent dans la première boîte de dialogue comme sr.DialogResult = Windows.Forms.DialogResult.None ne semble pas fonctionner?

Je l'ai essayé élever le sous-événement nouveau (c'est un clic d'un élément de menu), mais cela ne fonctionne pas avec la technologie que je utilise (VSTO ruban).

Était-ce utile?

La solution

Essayez de déplacer votre logique de validation soit dans la boîte de dialogue lui-même, ou dans un gestionnaire d'événements de clôture de la boîte de dialogue. Ce dernier pourrait être plus facile. Mes compétences en VB.NET sont pratiquement inexistants alors pardonnez-moi si cela est hors de la marque:

Dim sr As New SlideRangeDialog 
Dim dr As Windows.Forms.DialogResult 
AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing
dr = sr.ShowDialog 

Puis, plus tard:

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

Autres conseils

Je pense que vous devez gérer l'ok (ou NO Oui, etc) et d'annuler sous la forme elle-même et pas le fermer si la validation échoue.

Sur le formulaire qui est utilisé comme une boîte de dialogue vous devez gérer les événements Cliquez sur des boutons. Ensuite, exécutez un test dans le gestionnaire d'événement pour décider si la forme doit être fermée. Si elle ne vous pouvez alors régler le DialogResult à tout ce dont vous avez besoin et exécuter Me.Close ()

Voir un exemple

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

Depuis sa VSTO et vous rencontrez des problèmes d'utilisation « normale » des moyens de communication entre les écrans, pourquoi ne pas vous essayez d'utiliser PInvoke à la place: Étant donné que vous savez comment obtenir les hwnds des fenêtres de sujet en utilisant ce code:

    [DllImport("user32.dll")]
    public static extern bool SetFocus(IntPtr hwnd); 

Comme il est suggéré Preet AMHA plus simple de gérer la déclaration « Me.Close » des événements de bouton.

Vous pouvez aussi le faire en le retirant du gestionnaire d'événements de bouton et la fermeture de la forme dans votre arbre logique plus tard. Dans mon exemple, j'ai deux formes. Form1 a un bouton pour ouvrir Form2 et que l'on a deux boutons avec boutons OK et Annuler. Donc, la deuxième forme, vous pouvez utiliser les éléments suivants:

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

Vous devriez garder à l'esprit que lorsque vous utilisez la ShowDialog du formulaire est jamais disposé à moins que vous appelez spécifiquement pour elle. Un simple Oui / Non exemple pour demander si l'utilisateur veut fermer sûr.

   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

Le sous Button2_Click est appelé récursive de garder l'affichage tant que OK est choisi dans la deuxième forme et dans le NO Messagebox suivant. J'espère que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top