Où puis-je contrôler le comportement du « X » bouton de fermeture dans le coin supérieur droit d'un WinForm?
-
27-09-2019 - |
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
.
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 ...