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
.
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.
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
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
@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.
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.
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...!