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

StackOverflow https://stackoverflow.com/questions/2838979

Question

Je me aventure en faire ma demande de VB.NET un peu mieux à l'utilisation en faisant quelques-unes des formes modales.

Je pense avoir compris comment utiliser dlg.Show () et dlg.Hide () au lieu d'appeler dlg.ShowDialog (). J'ai une instance de mon dialogue modales dans ma principale formulaire de demande:

Public theModelessDialog As New dlgModeless

Pour tirer l'appel dialogue modales I

theModelessDialog.Show()

et dans le OK et Annuler les gestionnaires de bouton dans dlgModeless je

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 qui semble fonctionner très bien.

Le bouton « X » dans le coin supérieur droit devient moi, cependant. Quand je ferme le formulaire avec ce bouton, puis essayez de rouvrir la forme, je reçois

  

ObjectDisposedException a été Unhandled. Impossible d'accéder à un objet disposé.

Je sens que je suis la plupart du chemin, mais je ne peux pas savoir comment faire une des opérations suivantes:

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

Toutes les idées?

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

Était-ce utile?

La solution

Utilisez Me.Close() pour cacher la forme. Pour l'ouvrir, utilisez l'extrait suivant:

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

Si cela est la sauvegarde des données, alors vous aurez besoin de comprendre une certaine façon de les stocker (peut-être dans une variable statique / s sous la forme). Ceci est la bonne façon de faire ce que vous essayez d'atteindre bien.

Vous aurez aussi de me pardonner si mon VB est éteint, il a été un certain temps.

Autres conseils

Catch l'événement FormClosing et, si la raison est UserClosing, ensemble Annuler 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

l'événement FormClosing me permet de faire une sortie gérée de la forme, donc j'ai inclus une question pour confirmer la sortie. J'ai aussi une bterminate forme de drapeau pour forcer l'annulation où je veux qu'il et donc pas poser la question. Merci de votre suggestion m'a aidé aussi bien:)

    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

@John cachais la forme dans son code et les réponses ci-dessus fournir une solution à ce cas. Souvent, cependant, vous ne prévoyez pas d'utiliser à nouveau le formulaire, si vous avez vraiment faire le formulaire doit être mis au rebut. Toutes les activités Close connexes seront en un seul endroit si vous gérer l'événement FormClosing à l'aide Me.FormClosing en l'ajoutant à anyCancel / Fermer / code de 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 toute Me.Close existante. Si vous laissez le Me.Close vous allez créer une boucle infinie. Voir ce pour les différences subtiles entre Close et Dispose .

D'accord avec le traitement de l'événement FormClosing. Ou modifier les propriétés du formulaire pour cacher le système de contrôle X.

J'ai tout essayé et cela n'a pas fonctionné si vous voulez juste de fermer, sans montrer une messagebox, vous aurez juste besoin:

  

Private Sub FORM1_FormClosing (expéditeur comme objet, e Comme FormClosingEventArgs) Poignées Me.FormClosing

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

End Sub

Espérons que cela vous aide ...

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