ホームページ > バックエンド開発 > C#.Net チュートリアル > C# 言語の FormClosing および FormClosed イベントの Args パラメーターの CloseReason 列挙

C# 言語の FormClosing および FormClosed イベントの Args パラメーターの CloseReason 列挙

高洛峰
リリース: 2016-11-22 16:17:15
オリジナル
2304 人が閲覧しました

私のオペレーティング システムは Win7 Ultimate、VS バージョンは VS2012、.NET バージョンは .NET Framework 4.5 です。

フォームの FormClosing イベントでは、2 番目のパラメーター (FormClosingEventArgs 型) に列挙型変数 CloseReason があり、フォームの FormClosed イベントでも、2 番目のパラメーター (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

この CloseReason は、Windows がログアウトまたは閉じられたときにトリガーされます。ただし、Windows が現在のプログラムを閉じることができないと判断すると、プログラムを強制的に終了するため、ここに MessageBox などの要素を追加しないでください。 。

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 イベントがトリガーされた直後にプログラムがタスク マネージャーによって強制的に終了されることがわかります。この時間は非常に短いため、ここでメッセージ ボックスをポップアップするなどの操作は適切ではありません。それは無駄です)。

5. CloseReason.FormOwnerClosing

CloseReason.MdiFormClosing と同様に、フォーム A がフォーム B の所有者である場合、フォーム A が閉じられると、フォーム B が FormClosing および FormClosed イベントをトリガーするときにこの CloseReason が使用されます。

所有者としてのフォームに関する質問については、MSDN ページを参照してください:

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

現在のフォームを所有者として使用して別のフォームを開くメソッド:

FormChild formChild2 = new FormChild();
formChild2.Owner = this;
formChild2.Show();
ログイン後にコピー

6. CloseReason.ApplicationExitCall

Application.Exit() メソッドを呼び出してプログラムを終了する場合、CloseReason はこの値です。

最後に、FormClosing イベントと FormClosed イベントの呼び出しシーケンスについて説明します。

1. FormClosing イベントはフォームが閉じられる前にトリガーされ、FormClosed イベントはフォーム A の場合にトリガーされます。が mdi コンテナーであり、フォーム B の mdi 親がフォーム A である場合、イベントの呼び出しシーケンスは次のようになります:

フォーム B - FormClosing イベント - CloseReason

フォーム A - FormClosed イベント - CloseReason.UserClosing

3. A はフォーム B の所有者であり、イベントの呼び出し順序は次のとおりです:

フォーム B - FormClosing イベント - CloseReason.FormOwnerClosing

Window フォーム A - FormClosing イベント - CloseReason.UserClosing

フォーム B - FormClosed イベント - CloseReason.FormOwnerClosing

フォーム A - FormClosed イベント - CloseReason.UserClosing

関連ラベル:
c#
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート