web-dev-qa-db-fra.com

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

Dans MSDN, j'ai trouvé 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 différencier ces deux mon code?

Merci a tous.

78
Bohn

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 être fermé.

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 transformer l'expéditeur en contrôle Button et vérifiez, par exemple, si son nom est "CloseButton".

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 eu besoin de faire la distinction entre un clic sur X ou CloseButton, car je voulais effectuer quelque chose de spécifique sur l'événement FormClosing, comme fermer tous MdiChildren avant de fermer MDIContainerForm ou vérifier les modifications non enregistrées. Dans ces circonstances, nous n'avons pas besoin, selon moi, de nous différencier de l'un ou l'autre des boutons.

Fermeture par ALT+F4 déclenchera également l'événement FormClosing (), car il envoie un message au formulaire qui dit de fermer. Vous pouvez annuler l’événement en réglant la

FormClosingEventArgs.Cancel = true. 

Dans notre exemple, cela se traduirait par

e.Cancel = true.

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érifie s'il a encore quelque chose à faire avant de le fermer.

FormClosed se produit lorsque le formulaire est réellement fermé, donc après.

Est-ce que cela aide?

84
Will Marcouiller

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

Vous pouvez faire différentes actions, selon 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 cliquer sur le bouton x, cliquer avec le bouton droit de la souris sur la barre des tâches et cliquer sur "fermer" ou appuyer sur AltF4, etc. Tout cela aboutit à un CloseReason.UserClosing raison.

74
Philip Daubmeier

Le bouton "X" est enregistré en tant que DialogResult.Cancel. Une autre option consiste à évaluer DialogResult

Si vous avez plusieurs boutons sur votre formulaire, vous associez probablement déjà différents DialogResults à chacun d'eux, ce qui vous donnera le moyen de différencier 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;
            }
        }
    }
38
AlexScript

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();
    }
6
derloopkat

J'utilise toujours une méthode de fermeture de formulaire dans mes applications qui capture alt + x de mon bouton de sortie, alt + f4 ou un autre événement de fermeture de formulaire a été initié. Toutes mes classes ont le nom de classe défini en tant que 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 aussi une déclaration pour la méthode de fermeture de formulaire - this.FormClosing = My Form Closing Form Closing method name

Le code pour cela:

namespace Rexcel_II
{
    public partial class frmRexcel : Form
    {
        private string mstrClsTitle = "frmRexcel";

        public frmRexcel()
        {
            InitializeComponent();

            this.FormClosing += frmRexcel_FormClosing;
        }

        /// <summary>
        /// Handles the Button Exit Event executed by the Exit Button Click
        /// or Alt + x
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExit_Click(object sender, EventArgs e)
        {            
            this.Close();        
        }


        /// <summary>
        /// Handles the Form Closing event
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmRexcel_FormClosing(object sender, FormClosingEventArgs e)
        {

            // ---- If windows is shutting down, 
            // ---- I don't want to hold up the process
            if (e.CloseReason == CloseReason.WindowsShutDown) return;
            {

                // ---- Ok, Windows is not shutting down so
                // ---- either btnExit or Alt + x or Alt + f4 has been clicked or
                // ---- another form closing event was intiated
                //      *)  Confirm user wants to close the application
                switch (MessageBox.Show(this, 
                                    "Are you sure you want to close the Application?",
                                    mstrClsTitle + ".frmRexcel_FormClosing",
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                {

                    // ---- *)  if No keep the application alive 
                    //----  *)  else close the application
                    case DialogResult.No:
                        e.Cancel = true;
                        break;
                    default:
                        break;
                }
            }
        }
    }
}
3
Tee Shot

Vous pouvez essayer d'ajouter un gestionnaire d'événements de la manière suivante: ouvrez un formulaire en mode Création, ouvrez la fenêtre des propriétés ou appuyez sur la touche 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/fr-9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral

2
lisa
if (this.DialogResult == DialogResult.Cancel)
        {

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

si la condition s'exécutera 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.

1
phani kiran
namespace Test
{
    public partial class Member : Form
    {
        public Member()
        {
            InitializeComponent();
        }

        private bool xClicked = true;

        private void btnClose_Click(object sender, EventArgs e)
        {
            xClicked = false;
            Close();
        }

        private void Member_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (xClicked)
            {
                // user click the X
            } 
            else 
            {
                // user click the close button
            }
        }
    }
}
0
Dragan Menoski