107 votes

Comment savoir que l'utilisateur a cliqué sur "X" ou sur le bouton "Fermer"?

Dans MSDN, j'ai découvert que CloseReason.UserClosing savait que l'utilisateur avait décidé de fermer le formulaire, mais je suppose que c'est la même chose pour le clic sur le bouton X ou le bouton de fermeture. Alors, comment puis-je différencier ces deux dans mon code?

Merci a tous.

99voto

Will Marcouiller Points 11649

En supposant que vous êtes en demandant WinForms, vous pouvez utiliser le FormClosing() de l'événement. L'événement FormClosing() est déclenchée à tout moment, un formulaire est fermé.

Pour détecter si l'utilisateur a cliqué sur X ou votre CloseButton, vous pouvez l'obtenir par le biais de l'objet expéditeur. Essayez de lancer l'expéditeur comme un Bouton de contrôle, et de vérifier peut-être pour son nom "CloseButton", par exemple.

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
    if (string.Equals((sender as Button).Name, @"CloseButton"))
        // Do something proper to CloseButton.
    else
        // Then assume that X has been clicked and act accordingly.
}

Sinon, je n'ai jamais nécessaire de différencier si X ou CloseButton a été cliqué, que je voulais réaliser quelque chose de spécifique sur la FormClosing événement, comme la fermeture de tous les MdiChildren avant la fermeture de la MDIContainerForm, ou en cas de vérification pour les modifications non enregistrées. Dans ces circonstances, nous n'avons pas besoin, selon moi, à différencier de l'un des boutons.

EDIT Fermeture par [ALT]+[F4] permet également de déclencher l'FormClosing() de l'événement, car il envoie un message à l'écran qui dit de fermer. Vous pouvez annuler l'événement, par le réglage de la

FormClosingEventArgs.Cancel = true. 

Dans notre exemple, ce serait traduit en être

e.Cancel = true.

Notez la différence entre les FormClosing() et le FormClosed() des événements.

FormClosing se produit lorsque le formulaire reçu le message d'être fermé, et de vérifier si elle a quelque chose à faire avant de fermer.

FormClosed se produit lorsque le formulaire est fermé, donc après qu'il est fermé.

Cela vous aide?

82voto

Philip Daubmeier Points 6559

L' CloseReason énumération que vous avez trouvé sur MSDN est juste dans le but de vérifier si l'utilisateur a fermé l'application, ou elle est due à un arrêt ou fermé par le gestionnaire de tâches, etc...

Vous pouvez faire différentes actions, en fonction de la raison, comme:

void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    if(e.CloseReason == CloseReason.UserClosing)
        // Prompt user to save his data

    if(e.CloseReason == CloseReason.WindowsShutDown)
        // Autosave and clear up ressources
}

Mais comme vous l'avez deviné, il n'y a pas de différence entre cliquant sur le bouton x, ou un clic droit sur la barre des tâches et en cliquant sur "fermer", ou en appuyant sur Alt F4, etc. Tout se termine dans un CloseReason.UserClosing raison.

48voto

AlexScript Points 149

Le bouton "X" est enregistré sous la forme DialogResult.Cancel . Une autre option consiste à évaluer le DialogResult .

Si vous avez plusieurs boutons dans votre formulaire, vous associez probablement déjà différents DialogResult s à chacun d'eux, ce qui vous donnera le moyen de faire la différence entre chaque bouton.

(Exemple: btnSubmit.DialogResult = DialogResult.OK , btnClose.DialogResult = Dialogresult.Abort )

     public Form1()
    {
        InitializeComponent();

        this.FormClosing += Form1_FormClosing;
    }

    /// <summary>
    /// Override the Close Form event
    /// Do something
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
    {
        //In case windows is trying to shut down, don't hold the process up
        if (e.CloseReason == CloseReason.WindowsShutDown) return;

        if (this.DialogResult == DialogResult.Cancel)
        {
            // Assume that X has been clicked and act accordingly.
            // Confirm user wants to close
            switch (MessageBox.Show(this, "Are you sure?", "Do you still want ... ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
            {
                //Stay on this form
                case DialogResult.No:
                    e.Cancel = true;
                    break;
                default:
                    break;
            }
        }
    }
 

8voto

derloopkat Points 163

Il détermine quand fermer une application si un formulaire est fermé (si votre application n'est pas jointe à un formulaire spécifique).

     private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        if (Application.OpenForms.Count == 0) Application.Exit();
    }
 

1voto

phani kiran Points 11
 if (this.DialogResult == DialogResult.Cancel)
        {

        }
        else
        {
            switch (e.CloseReason)
            {
                case CloseReason.UserClosing:
                    e.Cancel = true;
                    break;
            }
        }
 

si la condition sera exécutée lorsque l'utilisateur cliquera sur 'X' ou fermera le bouton du formulaire. Le reste peut être utilisé lorsque l'utilisateur clique sur Alt + f4 à d'autres fins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X