簡體   English   中英

使用退出按鈕后,FormClosing事件觸發兩次

[英]FormClosing event fires twice after using exit button

我有一個退出表單的按鈕,這是代碼

    DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
    if (dialogResult == DialogResult.No)
    {
    }
    else
    {
        Application.Exit();
    }

我嘗試使用調試器模式,然后單擊“是”,它將通過Application.Exit(),然后啟動FormClosing事件,然后運行相同的對話框。

我還嘗試刪除FormClosing事件中的代碼,以便它僅具有Application.Exit(),但使用Alt + F4或單擊X按鈕將自動退出應用程序。

我的問題是我該如何詢問用戶是否要退出該程序但不兩次觸發對話框?

在此先感謝您,我讓大家知道我只是一個初學者,這是我最大的項目,所以我想做得更好。

這是一個例子。 它僅詢問確認關閉是否由用戶啟動-Windows重新啟動時,您可能不希望彈出MessageBox。

private void form_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            Application.Exit();
        }
    }
    else 
    {
        // Cancel the close
        e.Cancel = true;
    }
 }

有兩種方法可以實現此目的。

  • 取消訂閱偶數點擊按鈕
  • 正如stuartd的答案中所建議的,檢查關閉的原因(但是他的答案中有一個問題,因此在修復中也添加此方法,這樣對將來的人會有所幫助。)

我假設,在兩種情況下都需要此確認,即單擊按鈕和單擊“ x”按鈕,因此您已經在兩個處理程序中放入了相同的代碼。

方法一

在您要求用戶確認以及用戶是否單擊“是”時,在按鈕單擊的處理程序中。 上線之前

Application.Exit();

您應該退訂表單關閉事件。 這樣,它在執行Application.Exit()時不得引發表單關閉事件。

假設您的表單是MainForm,事件是MainForm_Closing,則看起來

    private void btnClose_Click(object sender, EventArgs e)
    {
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            this.FormClosing -= MainForm_FormClosing;
            Application.Exit();
        }
    }

因此在執行Application.Exit()時不會引發表單關閉事件,因此將解決您的問題。

方法二

正如stuartd所建議的那樣(按照我的說法,這是一種更簡潔的方法。為此+1),您可以在“ Form Closing事件處理程序中檢查表單關閉的原因。

請注意 ,他的示例代碼中有一個小問題(錯誤)[您已經接受了它作為答案!!]。 單擊'x' button或錯誤地Alt+F4 如果用戶在確認消息上單擊“否”,則也將關閉表單,因為沒有其他條件的處理。 正確的解決方案應如下所示。

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
            {
                DialogResult dialogResult = MessageBox.Show("Are you sure you want to exit?", "Exit Program?", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                    Application.Exit();
                else
                    e.Cancel = true;    //stopping Form Close perocess.
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM