C # Pourquoi form.Close () ne ferme-t-il pas le formulaire?

J’ai un gestionnaire d’événement de clic de bouton avec le pseudo-code suivant:

private void btnSave_Click(object sender, EventArgs e) { if(txt.Text.length == 0) this.Close(); else // Do something else // Some other code... } 

Ceci est juste un code simple, mais le fait est que, lorsque la longueur du texte est égale à zéro, je souhaite fermer le formulaire. Mais au lieu de fermer le formulaire, le code exécute la partie // Un autre code. Une fois que le gestionnaire d’événements click est complètement exécuté, le formulaire est fermé.

Je sais que, lorsque je place return juste après this.Close() le formulaire se ferme, mais j’aimerais savoir POURQUOI le formulaire n’est pas directement fermé lorsque vous appelez this.Close() . Pourquoi le rest du gestionnaire d’événements est-il exécuté?

Le rest du gestionnaire d’événements est exécuté car vous n’avez pas quitté la méthode. C’est aussi simple que ça.

L’appel de this.Close() ne “supprime” pas immédiatement le formulaire (et le gestionnaire d’événements en cours). Le formulaire sera collecté ultérieurement par le ramasse-miettes s’il n’y a plus de références au formulaire.

this.Close() n’est rien d’autre qu’un appel de méthode classique et, à moins que la méthode ne lève une exception, vous restrez dans le contexte de votre méthode actuelle.

Fermer ne cache que la forme; le formulaire est toujours actif et ne recevra pas un autre événement Load si vous le réaffichez.

Pour réellement le supprimer de la mémoire, utilisez Dispose ().

La réponse est simple puisque vous exécutez votre méthode actuelle, donc this.Close () sera mis en queue jusqu’à ce que vous soyez retourné explicitement ou que votre méthode excutante actuelle lève une exception.

Une autre solution possible est que, si vous ouvrez un nouveau formulaire et souhaitez fermer le formulaire actuel: si vous utilisez newForm.ShowDialog() au lieu de newForm.Show() il ne ferme pas le currentForm avec currentForm.Close() tant que newForm est également fermé.

À moins que le formulaire ne soit un formulaire modal (ouvert avec .ShowDialog ()), Form.Close () dispose également du formulaire. Donc, vous ne pourrez plus le rouvrir après cela, malgré ce que d’autres auraient pu dire. Il y a Form.Visible pour ce comportement (masquer / afficher le formulaire).

Le point ici est que .Close () ne retourne pas de la section elle est appelée pour plusieurs raisons. Par exemple, vous pouvez appeler SomeForm.Close () à partir d’un autre formulaire, d’une classe ou autre.

Close () est juste une méthode comme une autre. Vous devez explicitement revenir d’une méthode qui appelle Close () si c’est ce que vous voulez.

L’appel de MessageBox.Show (frmMain, “un message”, “un titre”) ajoute le formulaire “TextDialog” à la collection de formulaires Application.OpenForms () de l’application, à côté du formulaire principal frmMain lui-même. Il rest après la fermeture de la boîte de message.

Lorsque cela se produit et que vous appelez le délégué du bouton OK pour fermer le formulaire principal, l’appel de frmMain.Close () ne fonctionnera pas, le formulaire principal ne disparaîtra pas et le programme ne se terminera pas comme il le sera généralement après avoir quitté le délégué OK. Seul Application.Exit () fermera tous les messages de la boîte de messages “TextDialog”.