Où puis-je contrôler le comportement du bouton de fermeture "X" en haut à droite d'une winform?

Je m'aventure à faire mon VB.NET application un peu mieux utiliser en rendant certaines des formes modeless.

je pense que j'ai trouvé comment utiliser la 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 principal de l'application:

Public theModelessDialog As New dlgModeless

À feu vers le haut de la boîte de dialogue non modale j'appelle

theModelessDialog.Show()

et au sein de l'OK et Annuler des gestionnaires de bouton 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 que semble bien fonctionner.

le bouton "X"en haut à droite me fait mal. Quand je ferme le formulaire avec ce bouton, puis essayer de rouvrir le formulaire, je reçois

ObjectDisposedException était non gérée. Impossible d'accéder à un objet supprimé.

je me sens comme si j'étais la plupart du temps là-bas mais je ne peux pas comprendre comment faire l'un ou l'autre des suivants:

  • Masquer ce bouton" X"
  • Attrapez l'événement pour que je ne dispose pas de l'objet (juste le traiter comme je l'ai frappé Annuler)

des idées?

la classe de ce dialogue est System.Windows.Forms.Form.

15
demandé sur Tshepang 2010-05-15 09:01:49

6 réponses

Utiliser Me.Close() pour cacher la forme. Pour l'ouvrir, utilisez le code suivant:

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

S'il s'agit de sauvegarder des données, alors vous aurez besoin de trouver un moyen de les stocker (peut-être dans une variable statique/s dans la forme). C'est la méthode appropriée pour faire ce que vous essayez d'atteindre.

vous devrez aussi me pardonner si ma VB est désactivée, ça fait longtemps.

4
répondu Matthew Scharley 2010-05-15 05:16:11

Attrapez L'événement FormClosing et, si la raison est UserClosing, mettez Cancel sur l'événement à 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
répondu Michael Todd 2010-05-15 05:09:43

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

    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
répondu Philip 2012-04-06 08:53:16

@John cachait le formulaire dans son code et les réponses ci-dessus fournissent une solution à ce cas. Souvent, cependant, vous n'avez pas l'intention d'utiliser le formulaire à nouveau, de sorte que vous vraiment vous voulez que le formulaire soit éliminé. Toutes les activités liées à Close seront au même endroit si vous manipulez L'événement FormClosing en utilisant Me.FormClosing en l'ajoutant au code anyCancel/Close/Exit 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 Me.Close. Si vous laissez l' Me.Close vous allez créer une boucle infinie. Voir ceci pour les différences subtiles entre Close et Dispose.

1
répondu Neil Dunlop 2018-06-04 10:19:42

D'accord avec le traitement de L'événement FormClosing. Ou changez les propriétés sur le formulaire pour cacher le contrôle system X.

0
répondu robert mcbean 2010-05-15 05:28:27

j'ai tout essayé et ça ne fonctionne pas si vous voulez juste fermer, sans montrer un messagebox, vous aurez juste besoin de:

sous FORM1_FormClosing privé (expéditeur comme objet, e comme FormClosingEventArgs) me manipule.FormClosing

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

End Sub

j'Espère que cela vous aide...!

0
répondu Esther Hearne 2016-12-09 15:48:19