文档章节

C#语言FormClosing与FormClosed事件中Args参数的CloseReason枚举

北风其凉
 北风其凉
发布于 2016/07/13 20:57
字数 1010
阅读 1430
收藏 2

我的操作系统是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 - FormClosed事件 - CloseReason.MdiFormClosing

窗体A - FormClosed事件 - CloseReason.UserClosing

3、如果窗体A是窗体B的owner,那么事件的调用顺序是:

窗体B - FormClosing事件 - CloseReason.FormOwnerClosing

窗体A - FormClosing事件 - CloseReason.UserClosing

窗体B - FormClosed事件 - CloseReason.FormOwnerClosing

窗体A - FormClosed事件 - CloseReason.UserClosing


最后分享下我用于测试此问题的C#工程,该工程使用VS2012建立:

http://pan.baidu.com/s/1pLF3FJH

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 118
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
制作SCORM课件离线播放器(C#)

概述 SCORM标准的课程是e-learning比较常用的标准,但课程要放到LMS浏览才看到课件数据的交互很不方便,下面介绍.net写的SCORM课件播放器,方便离线浏览SCORM课程或用于SCORM的课件测试。 主...

彭博
2012/03/09
2.1K
0
C#中关闭子窗口而不释放子窗口对象的方法

1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。 Form2 f2 = new Form2(); 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 private void Con...

qian_tao
2018/08/28
0
0
C#命名规范中文版/C#编码规范中文版

最新文档地址https://github.com/hiramtan/CSharpNamingGuidelines_Chinese 编码规范中文版 示例 ----- 参考资料 微软官方老版本:https://msdn.microsoft.com/en-us/library/ms229043(v=vs.1......

海贝Hibey
2018/07/17
0
0
c#事件

任何编写过图形用户界面(GUI)软件的开发人员都熟悉事件处理编程,当用户与GUI控制进行交互时(例如点击表格上的按钮),作为上述事件的反应,就会执行一个或多个方法。没有用户的参与,事件...

晨曦之光
2012/03/09
639
0
图像处理控件ImageGear for .NET中如何给应用程序添加PDF功能

在ImageGear for .NET中,一旦基础的应用程序完成之后,你就可以使用下面的步骤对它添加PDF功能支持。 1、首先需要对ImageGear for .NET PDF Assembly添加一个引用。 在Solution Explorer中,...

愤怒的outman
2013/09/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一致性hash和虚拟节点

consistent hashing 算法的原理 consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在key 映射关系,尽可能的满足单调性的要求。 下面就...

群星纪元
20分钟前
2
0
说一下Dubbo 的工作原理?注册中心挂了可以继续通信吗?

面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ、ES、Redis、Dubbo,上来先问你一些思考性的问题、原理,比如 kafka 高可用架...

李红欧巴
30分钟前
19
0
腾讯面试:一条SQL语句执行得很慢的原因有哪些?

说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。 之前腾讯面试的实...

java菜分享
48分钟前
11
0
Java 基本功 之 CAS

本文首发于个人公众号《andyqian》, 期待你的关注! 前言 在Java并发编程中,我们经常使用锁对竞争资源予以并发控制,以解决资源竞争的问题。但无论是使用 Lock 还是 Synchronized,随着锁机...

andyqian
52分钟前
4
0
信号量与条件变量的区别

注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信; 而条件变量、互...

shzwork
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部