web-dev-qa-db-de.com

Woher weiß der Benutzer, dass er auf "X" oder die Schaltfläche "Schließen" geklickt hat?

In MSDN habe ich CloseReason.UserClosing gefunden, um zu wissen, dass der Benutzer beschlossen hatte, das Formular zu schließen Aber ich denke, es ist dasselbe, wenn Sie entweder auf die X-Schaltfläche klicken oder auf die Schließen-Schaltfläche klicken .. __ Wie kann ich diese beiden unterscheiden? mein code

Danke euch allen.

78
Bohn

Angenommen, Sie fragen nach WinForms, können Sie das Ereignis FormClosing () verwenden. Das Ereignis FormClosing () wird jedes Mal ausgelöst, wenn ein Formular geschlossen werden soll.

Um festzustellen, ob der Benutzer auf X oder auf Ihren CloseButton geklickt hat, können Sie ihn über das Absenderobjekt abrufen. Versuchen Sie, den Absender als Button-Steuerelement zu verwenden, und überprüfen Sie beispielsweise den Namen "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.
}

Ansonsten musste ich nie unterscheiden, ob auf X oder CloseButton geklickt wurde, da ich bestimmte Aktionen für das FormClosing-Ereignis ausführen wollte, z. B. das Schließen aller MdiChildren vor dem Schließen von MDIContainerForm oder das Überprüfen von Ereignissen auf nicht gespeicherte Änderungen. Unter diesen Umständen müssen wir meiner Meinung nach nicht von beiden Knöpfen unterscheiden.

Schluss mit ALT+F4 Löst auch das FormClosing () -Ereignis aus, wenn eine Nachricht an das Formular gesendet wird, die das Schließen fordert. Sie können das Ereignis abbrechen, indem Sie die

FormClosingEventArgs.Cancel = true. 

In unserem Beispiel würde dies bedeuten

e.Cancel = true.

Beachten Sie den Unterschied zwischen den Ereignissen FormClosing () und FormClosed () .

FormClosing tritt auf, wenn das Formular die zu schließende Nachricht erhalten hat und überprüft, ob es etwas zu tun hat, bevor es geschlossen wird.

FormClosed tritt auf, wenn das Formular tatsächlich geschlossen wird, also nachdem es geschlossen wurde.

Hilft das?

84

Die CloseReason-Aufzählung, die Sie in MSDN gefunden haben, dient nur dazu zu überprüfen, ob der Benutzer die App geschlossen hat oder ob sie aufgrund eines Herunterfahrens oder durch den Task-Manager usw. geschlossen wurde.

Sie können je nach Grund verschiedene Aktionen ausführen, z.

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
}

Aber wie Sie vermutet haben, gibt es keinen Unterschied zwischen dem Klicken auf die Schaltfläche x oder dem Klicken mit der rechten Maustaste auf die Taskleiste und dem Klicken auf "Schließen" oder dem Drücken von AltF4usw. Alles endet in einem CloseReason.UserClosing Grund.

74

Die Schaltfläche "X" registriert sich als DialogResult.Cancel. Eine andere Option besteht darin, die DialogResult auszuwerten. 

Wenn Sie in Ihrem Formular über mehrere Schaltflächen verfügen, weisen Sie wahrscheinlich bereits verschiedenen DialogResults zu. Dies gibt Ihnen die Möglichkeit, den Unterschied zwischen den einzelnen Schaltflächen zu erkennen. 

(Beispiel: 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

Sie bestimmt, wann die Anwendung geschlossen werden soll, wenn ein Formular geschlossen wird (wenn Ihre Anwendung nicht an ein bestimmtes Formular angehängt ist).

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

Ich verwende in meinen Anwendungen immer eine Form Close-Methode, die alt + x von meinem Exit-Button abfängt. alt + f4 oder ein anderes Formularabschlussereignis wurde initiiert. Alle meine Klassen haben in diesem Fall den Klassennamen Private String mstrClsTitle = "grmRexcel", eine Exit-Methode, die die Form Closing Method und eine Form Closing Method aufruft. Ich habe auch eine Anweisung für die Formularschließmethode - this.FormClosing = My Form Closing Form Closing method name

Der Code dafür:

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

Sie können versuchen, einen Ereignishandler wie folgt hinzuzufügen: Öffnen Sie das Formular in der Entwurfsansicht, öffnen Sie das Eigenschaftsfenster, oder drücken Sie die Taste F4. Klicken Sie auf die Schaltfläche der Ereignissymbolleiste, um Ereignisse im Formularobjekt anzuzeigen, suchen Sie das FormClosing-Ereignis in der Gruppe "Verhalten" und doppelklicken Sie darauf. Referenz: https://social.msdn.Microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-closing-event?forum=csharpgeneral

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

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

if Bedingung wird ausgeführt, wenn der Benutzer auf "X" oder die Schaltfläche "Schließen" im Formular klickt. Der else kann verwendet werden, wenn der Benutzer zu einem anderen Zweck auf Alt + F4 klickt

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