惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
Hacker News: Ask HN
Hacker News: Ask HN
L
Lohrmann on Cybersecurity
PCI Perspectives
PCI Perspectives
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
月光博客
月光博客
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
The GitHub Blog
The GitHub Blog
Webroot Blog
Webroot Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
TaoSecurity Blog
TaoSecurity Blog
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
F
Full Disclosure
U
Unit 42
Jina AI
Jina AI
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
腾讯CDC
T
Threatpost
H
Hacker News: Front Page
P
Palo Alto Networks Blog
博客园 - 聂微东
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
Help Net Security
Help Net Security
L
LINUX DO - 热门话题
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Spread Privacy
Spread Privacy

博客园 - 无之无

别了博客园! 即将没落的博客园?!!! SQL里ROWCOUNT的使用 阿里云的背后故事(希望别被关了) LINQ:是BUG还是~~~ 集合代理类的实现 WPF对绑定到数据的树初始化选择项 SilverLight中的数据绑定 [请教]关于 .NET 应用的几个问题请教!!!( 如何解决 自定义控件 构造被设计器删除? 遭遇品牌电脑的尴尬 面对VS2005,我遇到了BUG? FOREACH的遍历 该死的微软,该死的文档,该死的ExecuteCommand Windows Form的初始化大小记录处理问题 怪异的Windows Form事件 .Net再发行包与强名称 托管与非托管的混合编程问题 关于WMI
MDI窗体关闭问题解决一例
无之无 · 2005-04-09 · via 博客园 - 无之无

MDI子窗体中的一个是导航窗体,该窗体定义了CLOSING事件处理:检测窗体的关闭标志是否允许,如果不允许则取消关闭操作,这样保证了导航窗体的不被关闭而永久存在。


问题:

当关闭MDI容器窗体的时候,因为其中一个子窗体的关闭事件被取消了,所以关闭动作失败,导致要关闭MDI主窗体只能通过调用Application的Exit方法来实现真正的关闭操作。

解决:
当关闭MDI子窗体的时候,由于导航窗体有关闭控制处理,可能会取消窗体的关闭操作,因此设想:在主窗体关闭的时候,设置导航窗体的关闭标志为允许关闭,这样主窗体就不会因为子窗体的关闭被取消而取消了。但实验结果是不可行:所有子窗体的CLOSING事件都在主窗体的CLOSING事件之前触发,当在主窗体进行可关闭标志的设置的时候,对主窗体已经是无效的了。感觉很沮丧,总不能让用户执行两次关闭操作吧?使用Application.Exit来处理,也感觉不理想,便采用对导航窗体的可关闭标志进行置位后再次调用关闭函数来实现。
经过跟踪处理,发现,主窗体和所有的子窗体共用同一个CLOSING事件参数(System.ComponentModel.CancelEventArgs),因此导致只要任何一个窗体(包括主窗体和子窗体)取消的关闭事件,那么整个关闭操作就失败。基于这个原因,在主窗体的CLOSING事件里面,设置CANCEL=false轻松解决问题(因为主窗体的CLOSING事件永远都是最后一个被触发)。
以上解决方案又会带来一个漏洞:除了导航窗口外,如果有其它窗体确实需要取消关闭操作将会导致失败。对于这个问题,可以采用以下两个方案处理:
1——
在主窗体的CLOSING处理中,强制CANCEL标记复位,然后执行每个子窗体是否确实允许关闭的检测再来设置CANCEL标志。
这个方案不好的地方是主窗体必须知道子窗体是否定义了指定的函数,导致主窗体对子窗体的实现类型存在依赖

2——
基于方案1中存在的问题,考虑:各子窗体是否真的可以被关闭的标志置于Tag属性中,这样,子窗体与主窗体之间只要达成这个协议就可以很好的解决这个问题。
相关代码:
子窗体Closing事件代码:


主窗体Closing事件处理代码: