Dans MSDN, j'ai découvert CloseReason.UserClosing
que l'utilisateur avait décidé de fermer le formulaire, mais je suppose que c'est la même chose pour les deux en cliquant sur le bouton X ou en cliquant sur le bouton de fermeture. Alors, comment puis-je différencier ces deux dans mon code?
Merci a tous.
Réponses:
En supposant que vous demandez WinForms, vous pouvez utiliser l' événement FormClosing () . L'événement FormClosing () est déclenché à chaque fois qu'un formulaire doit se fermer.
Pour détecter si l'utilisateur a cliqué sur X ou sur votre CloseButton, vous pouvez l'obtenir via l'objet expéditeur. Essayez de convertir l'expéditeur en contrôle Button et vérifiez peut-être son nom "CloseButton", par exemple.
Sinon, je n'ai jamais eu besoin de différencier si X ou CloseButton a été cliqué, car je voulais effectuer quelque chose de spécifique sur l'événement FormClosing, comme fermer tous les MdiChildren avant de fermer le MDIContainerForm, ou vérifier l'événement pour les modifications non enregistrées. Dans ces circonstances, nous n'avons pas besoin, selon moi, de nous différencier des deux boutons.
La fermeture par ALT+ F4déclenchera également l'événement FormClosing (), car il envoie un message au formulaire indiquant de fermer. Vous pouvez annuler l'événement en réglant le
Dans notre exemple, cela se traduirait par
Notez la différence entre les événements FormClosing () et FormClosed () .
FormClosing se produit lorsque le formulaire a reçu le message à fermer et vérifiez s'il a quelque chose à faire avant qu'il ne soit fermé.
FormClosed se produit lorsque le formulaire est effectivement fermé, donc après sa fermeture.
est-ce que cela aide?
la source
le
CloseReason
énumération que vous avez trouvée sur MSDN est juste dans le but de vérifier si l'utilisateur a fermé l'application, ou si elle était due à un arrêt, ou fermée par le gestionnaire de tâches, etc.Vous pouvez faire différentes actions, selon la raison, comme:
Mais comme vous l'avez deviné, il n'y a aucune différence entre cliquer sur le bouton x, ou cliquer avec le bouton droit sur la barre des tâches et cliquer sur «fermer», ou appuyer sur Alt F4, etc. Tout se termine par une
CloseReason.UserClosing
raison.la source
Le bouton "X" s'enregistre car
DialogResult.Cancel
une autre option consiste à évaluer le fichierDialogResult
.Si votre formulaire comporte plusieurs boutons, vous associez probablement déjà différents
DialogResult
s à chacun et cela vous fournira les moyens de faire la différence entre chaque bouton.(Exemple:
btnSubmit.DialogResult = DialogResult.OK
,btnClose.DialogResult = Dialogresult.Abort
)la source
DialogResult
resteNone
. Quel pourrait être le problème?X
faitDialogResult
contenirCancel
, pasNone
. AssignerNone
à votre bouton revient à ne pas définir du tout sa.DialogResult
propriété, et si vous appelez àform.Close()
partir du gestionnaire d'événements de votre bouton,form.DialogResult
contiendraCancel
. Seule l'attribution d'une valeur autre queNone
ouCancel
à tous vos boutons de fermeture de formulaire vous permettra de faire la distinction souhaitée.Comment détecter si le formulaire s'est fermé en cliquant sur le bouton X ou en appelant
Close()
code?Vous ne pouvez pas vous fier à la raison de la fermeture de l'événement de fermeture du formulaire, car si l'utilisateur clique sur le bouton X de la barre de titre ou ferme le formulaire en utilisant Alt + F4 ou utilise le menu système pour fermer le formulaire ou le formulaire se ferme en appelant la
Close()
méthode, tout ci-dessus, la raison de la fermeture sera fermée par l'utilisateur, ce qui n'est pas le résultat souhaité.Pour distinguer si le formulaire est fermé par le bouton X ou par la
Close
méthode, vous pouvez utiliser l'une des options suivantes:WM_SYSCOMMAND
, vérifiezSC_CLOSE
et définissez un drapeau.StackTrace
si l'un des cadres contient unClose
appel de méthode.Exemple 1 - Poignée
WM_SYSCOMMAND
Exemple 2 - Vérification de StackTrace
la source
Il détermine quand fermer l'application si un formulaire est fermé (si votre demande n'est pas jointe à un formulaire spécifique).
la source
J'utilise toujours une méthode de fermeture de formulaire dans mes applications qui intercepte alt + x de mon bouton de sortie, alt + f4 ou un autre événement de fermeture de formulaire a été lancé. Toutes mes classes ont le nom de classe défini comme Chaîne privée
mstrClsTitle = "grmRexcel"
dans ce cas, une méthode Exit qui appelle la méthode de fermeture de formulaire et une méthode de fermeture de formulaire. J'ai également une déclaration pour la méthode de fermeture de formulaire -this.FormClosing = My Form Closing Form Closing method name
.Le code pour cela:
la source
Vous pouvez essayer d'ajouter un gestionnaire d'événements à partir de la conception comme ceci: Ouvrez le formulaire en mode Création, ouvrez la fenêtre des propriétés ou appuyez sur F4, cliquez sur le bouton de la barre d'outils des événements pour afficher les événements sur l'objet Form, recherchez l'événement FormClosing dans le groupe Comportement et double-cliquez dessus. Référence: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral
la source
si la condition s'exécute lorsque l'utilisateur clique sur «X» ou sur le bouton de fermeture du formulaire. L'autre peut être utilisé lorsque l'utilisateur clique sur Alt + f4 à toute autre fin
la source
la source
Je suis d'accord avec le
DialogResult
-Solution comme étant la plus simple.Cependant, dans VB.NET, la conversion de type est requise pour obtenir la
CloseReason
propriété -Propertyla source
J'ai également dû enregistrer la fonction de fermeture dans la méthode "InitializeComponent ()" du formulaire:
Ma fonction "FormClosing" ressemble à la réponse donnée ( https://stackoverflow.com/a/2683846/3323790 ):
Une dernière chose à mentionner: il existe également une fonction "FormClosed" qui se produit après "FormClosing". Pour utiliser cette fonction, enregistrez-la comme indiqué ci-dessous:
la source
J'ai fait quelque chose comme ça.
la source