首頁 後端開發 C#.Net教程 C#語言FormClosing與FormClosed事件中Args參數的CloseReason枚舉

C#語言FormClosing與FormClosed事件中Args參數的CloseReason枚舉

Nov 22, 2016 pm 04:17 PM
c#

我的作業系統是Win7旗艦版,VS版本是VS2012,.NET版本為.NET Framework 4.5。

在窗體的FormClosing事件,第二個參數(FormClosingEventArgs類型)下有一個枚舉變數CloseReason,在窗體的FormClosed事件,第二個參數(FormClosedEventArgs類型)下也有一個列舉變數CloseReason 。這個CloseReason枚舉在命名空間System.Windows.Forms下。

如下段程式碼所示,CloseReason在窗體FormClosing事件的FormClosingEventArgs類型變數e中。

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
    switch (e.CloseReason)
    {
        case CloseReason.None: { MessageBox.Show("Closing: CloseReason.None"); } break;
        case CloseReason.WindowsShutDown: { MessageBox.Show("Closing: CloseReason.WindowsShutDown"); } break;
        case CloseReason.MdiFormClosing: { MessageBox.Show("Closing: CloseReason.MdiFormClosing"); } break;
        case CloseReason.UserClosing: { MessageBox.Show("Closing: CloseReason.UserClosing"); } break;
        case CloseReason.TaskManagerClosing: { MessageBox.Show("Closing: CloseReason.TaskManagerClosing"); } break;
        case CloseReason.FormOwnerClosing: { MessageBox.Show("Closing: CloseReason.FormOwnerClosing"); } break;
        case CloseReason.ApplicationExitCall: { MessageBox.Show("Closing: CloseReason.ApplicationExitCall"); } break;
    }
}
登入後複製

從元資料看,該枚舉一共有以下7個枚舉值:

#region 程序集 System.Windows.Forms.dll, v4.0.0.0
// C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.dll
#endregion

using System;

namespace System.Windows.Forms
{
    // 摘要:
    //     指定窗体关闭的原因。
    public enum CloseReason
    {
        // 摘要:
        //     关闭原因未定义或者无法确定。
        None = 0,
        //
        // 摘要:
        //     操作系统正在关闭所有应用程序以便准备关机。
        WindowsShutDown = 1,
        //
        // 摘要:
        //     此多文档界面 (MDI) 窗体的父窗体正在关闭。
        MdiFormClosing = 2,
        //
        // 摘要:
        //     用户正在通过用户界面 (UI) 关闭该窗体,例如通过单击窗体窗口上的“关闭”按钮,通过选择窗口控制菜单上的“关闭”按钮,或者通过按 Alt+F4
        //     等方式关闭。
        UserClosing = 3,
        //
        // 摘要:
        //     Microsoft Windows 任务管理器正在关闭应用程序。
        TaskManagerClosing = 4,
        //
        // 摘要:
        //     所有者窗体正在关闭。
        FormOwnerClosing = 5,
        //
        // 摘要:
        //     System.Windows.Forms.Application 类的 System.Windows.Forms.Application.Exit()
        //     方法被调用。
        ApplicationExitCall = 6,
    }
}
登入後複製

該枚舉的MSDN可以參考頁:

https://msdn.microsoft.com/en-us/library/ system.windows.forms.closereason(v=vs.110).aspx

除去None類型,本文對6種枚舉值都進行了測試,在此記錄下測試的結果。

1、CloseReason.WindowsShutDown

當Windows被註銷、關閉時觸發此CloseReason,不過不要在這裡加入MessageBox等元素,因為一旦Windows發現當前程式遲遲關不掉,就會將此程式強製關閉。

2、CloseReason.MdiFormClosing

當前窗體為Mdi子窗體時,Mdi容器窗體關閉時,在觸發當前的FormClosing和FormClosed事件時提示此CloseReason。

將目前窗體作為MdiParent開啟另一個窗體的方法:

FormChild formChild = new FormChild();
formChild.MdiParent = this;
formChild.Show();
登入後複製

(需要將本窗體的IsMdiContainer設定為True)

3、CloseReason.UserClosing

機手動關閉程式,例如使用者手動關閉程式,例如使用者Close( )函數,或點選程式右上角的“×”,關閉原因都是CloseReason.UserClosing。

4、CloseReason.TaskManagerClosing

當任務管理器關閉視窗時,會觸發此事件,但我在測試的時候發現,任務管理器關閉視窗具有一定的強制性。設定斷點後可發現,FormClosing事件觸發後不久程式就會被任務管理器強制關閉,這個時間非常短,因此不適合在此做一些諸如彈出MessageBox的事情(因為沒有用)。

5、CloseReason.FormOwnerClosing

類似CloseReason.MdiFormClosing,如果窗體A是窗體B的owner,則窗體A關閉時,窗體B觸發FormClosing和FormClosed事件時使用此CloseReason。

關於窗體作為owner的問題,可以參考MSDN頁面:

https://msdn.microsoft.com/en-us/library/system.windows.window.owner(v=vs.110).aspx

將目前窗體當作Owner開啟另一個窗體的方法:

FormChild formChild2 = new FormChild();
formChild2.Owner = this;
formChild2.Show();
登入後複製

6、CloseReason.ApplicationExitCall

呼叫Application.Exit()方法退出程式時,CloseReason為此值。

最後再說下FormClosing、FormClosed事件的調用順序:

1、FormClosing事件在窗體關閉前觸發,FormClosed事件在窗體關閉後觸發

2、如果窗體A是mdi容器,窗體B的mdi-parent是窗體A,那麼事件的調用順序是:

窗體B - FormClosing事件- CloseReason.MdiFormClosing

窗體A - FormClosing事件- CloseReason.UserClosing

窗體B - FormClosing事件- CloseReason.UserClosing

窗體B - Forma. MdiFormClosing

窗體A - FormClosed事件- CloseReason.UserClosing

3、如果窗體A是窗體B的owner,那麼事件的調用順序是:

窗體B - FormsClosing- CloseReason.Form體A - FormClosing事件- CloseReason.UserClosing

窗體B - FormClosed事件- CloseReason.FormOwnerClosing

窗體A - FormClosed事件- CloseReason.UserClosing

窗體A - FormClosed事件- CloseReason.UserClosing

🎜🎜🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1304
25
PHP教程
1251
29
C# 教程
1224
24
使用 C# 的活動目錄 使用 C# 的活動目錄 Sep 03, 2024 pm 03:33 PM

使用 C# 的 Active Directory 指南。在這裡,我們討論 Active Directory 在 C# 中的介紹和工作原理以及語法和範例。

C# 序列化 C# 序列化 Sep 03, 2024 pm 03:30 PM

C# 序列化指南。這裡我們分別討論C#序列化物件的介紹、步驟、工作原理和範例。

C# 中的隨機數產生器 C# 中的隨機數產生器 Sep 03, 2024 pm 03:34 PM

C# 隨機數產生器指南。在這裡,我們討論隨機數產生器的工作原理、偽隨機數和安全數的概念。

C# 資料網格視圖 C# 資料網格視圖 Sep 03, 2024 pm 03:32 PM

C# 資料網格視圖指南。在這裡,我們討論如何從 SQL 資料庫或 Excel 檔案載入和匯出資料網格視圖的範例。

C# 中的階乘 C# 中的階乘 Sep 03, 2024 pm 03:34 PM

C# 階乘指南。這裡我們討論 C# 中階乘的介紹以及不同的範例和程式碼實作。

C# 中的模式 C# 中的模式 Sep 03, 2024 pm 03:33 PM

C# 模式指南。在這裡,我們討論 C# 中模式的介紹和前 3 種類型,以及其範例和程式碼實作。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

C# 中的質數 C# 中的質數 Sep 03, 2024 pm 03:35 PM

C# 質數指南。這裡我們討論c#中素數的介紹和範例以及程式碼實作。

See all articles