web-dev-qa-db-fra.com

Où puis-je contrôler le comportement du bouton de fermeture "X" dans le coin supérieur droit d'un winform?

J'essaie de rendre mon application VB.NET un peu meilleure à utiliser en rendant certaines des formes sans modèle.

Je pense avoir compris comment utiliser dlg.Show () et dlg.Hide () au lieu d'appeler dlg.ShowDialog (). J'ai une instance de ma boîte de dialogue non modale dans mon formulaire de candidature principal:

Public theModelessDialog As New dlgModeless

Pour lancer le dialogue sans modèle que j'appelle

theModelessDialog.Show()

et dans les gestionnaires de boutons OK et Annuler dans dlgModeless j'ai

Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.OK
    Me.Hide()
End Sub

Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
    Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
    Me.Hide()
End Sub

et cela semble bien fonctionner.

Le bouton "X" en haut à droite me prend, cependant. Lorsque je ferme le formulaire avec ce bouton, puis que je tente de rouvrir le formulaire, je reçois

ObjectDisposedException n'a pas été gérée. Impossible d'accéder à un objet supprimé.

Je sens que je suis presque tout le chemin, mais je ne peux pas trouver comment faire l'une ou l'autre des choses suivantes:

  • Cacher ce bouton "X"
  • Attrapez l'événement pour que je ne dispose pas de l'objet (traitez-le simplement comme si j'avais cliqué sur Annuler)

Des idées?

La classe de cette boîte de dialogue est System.Windows.Forms.Form.

15
John

Utilisez Me.Close() pour masquer le formulaire. Pour l'ouvrir, utilisez l'extrait suivant:

If theModelessDialog.IsDisposed Then
    theModelessDialog = New dlgModeless
End If
dlgModeless.Show()

S'il s'agit de sauvegarder des données, vous devrez trouver un moyen de les stocker (peut-être dans une variable statique dans le formulaire). C’est la bonne façon de faire ce que vous essayez d’atteindre.

Vous devrez également me pardonner si mon VB est éteint, cela fait longtemps.

4
Matthew Scharley

Attrapez l'événement FormClosing et, si le motif est UserClosing, définissez Cancel sur l'événement sur true.

Quelque chose comme ce qui suit:

Private Sub Form1_FormClosing(sender as Object, e as FormClosingEventArgs) _ 
     Handles Form1.FormClosing

    if e.CloseReason = CloseReason.UserClosing then
        e.Cancel = true
        Me.Hide()
    end if

End Sub
21
Michael Todd

l'événement formclosing me permet de faire une sortie gérée du formulaire. J'ai donc inclus une question à confirmer pour quitter. J'ai aussi un indicateur de forme bterminate pour forcer l'annulation où je le veux et donc ne pas poser la question. Merci votre suggestion m'a aidé aussi :)

    Dim msgboxresponse As MsgBoxResult

    If e.CloseReason = CloseReason.UserClosing Then
        If Not Me.bTerminate Then
            msgboxresponse = MsgBox("Are you sure you want to cancel adding?", _
                                MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
            If msgboxresponse <> MsgBoxResult.Yes Then
                e.Cancel = True
                Return
            End If
        End If
    End If
1
Philip

@John Cachait le formulaire dans son code et les réponses ci-dessus apportaient une solution à ce problème. Souvent, cependant, vous n’avez pas l’intention de réutiliser le formulaire, vous avez donc faire veux que le formulaire soit éliminé. Toutes les activités liées à Close seront réunies au même endroit si vous gérez l'événement FormClosing à l'aide de Me.FormClosing en l'ajoutant au code Annulation/Fermeture/Sortie que vous avez déjà. par exemple. dans le cas de @ John:

Private Sub Cancel_Button_Click(ByVal sender As System.Object, _ 
                                     ByVal e As System.EventArgs) _
                                 Handles Cancel_Button.Click, Me.FormClosing
....More code
Me.Dispose
End Sub

Notez l'utilisation du Me.Dispose au lieu de tout Me.Close existant. Si vous quittez le Me.Close, vous créerez une boucle infinie. Voir this pour les différences subtiles entre Close et Dispose .

1
Neil Dunlop

J'ai tout essayé et cela n'a pas fonctionné Si vous voulez juste fermer sans afficher de boîte de message, vous aurez juste besoin de:

Private Sub FORM1_FormClosing (expéditeur en tant qu'objet, et en tant que FormClosingEventArgs) gère Me.FormClosing 

 >e.Cancel = False
 >FORM2.Show()   (if you want to show another form)

End Sub

J'espère que cela vous aide ...!

0
Esther Hearne

D'accord avec la gestion de l'événement FormClosing. Ou modifiez les propriétés du formulaire pour masquer le contrôle X du système.

0
Robert McBean