gpt4 book ai didi

.net - EventArgs Cancel 如何在 FormClosing 事件中工作?

转载 作者:行者123 更新时间:2023-12-01 09:10:22 29 4
gpt4 key购买 nike

e.Cancel 事件如何在 WinForm 上的 FormClosing 事件中工作?我知道您将其设置为 True 以取消关闭,但是表单在什么时候处理这​​个?属性(property)是否采取了次要行动?

如何在自定义控件中实现类似的操作? (C# 或 VB)

注意:我已经找了大约 30 分钟,在 Google 或 SO 搜索中找不到任何答案,所以如果它是重复的,我的错。

最佳答案

我认为原始发布者可能想知道当一些订阅者设置 Cancel = false 并且一些订阅者设置 Cancel = true 时会发生什么。如果是这样,那么“表单什么时候处理这​​个”这个问题就显得更重要了。

起初我想知道 setter 是否实现为 OR 或 AND 每个值。使用 Reflector检查 CancelEventArgs.Cancel 的 setter 表明它只是设置了一个私有(private)字段:

public bool Cancel
{
get{ return this.cancel; }
set{ this.cancel = value; }
}

所以我想偷看“Form.OnClosing(CancelEventArgs args)”会显示检查值的时间,就像之前的答案一样,但这不是 Reflector 显示的:

[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void OnClosing(CancelEventArgs e)
{
CancelEventHandler handler = (CancelEventHandler) base.Events[EVENT_CLOSING];
if (handler != null)
{
handler(this, e);
}
}

所以我启用了源代码调试,发现从 Events 集合中获取 EVENT_CLOSING 委托(delegate)会深入到窗口 API 中,这样 handler 在当表单设置 Cancel = true 时,OnClosing 的第一行是 null,这意味着托管代码从不真正测试是否 CancelEventArgs.Cancel == 真。如果你想了解 EventHandlerList 内部发生的丑陋情况,你会得到这个:

get { 
ListEntry e = null;
if (parent == null || parent.CanRaiseEventsInternal)
{
e = Find(key);
}
if (e != null) {
return e.handler;
}
else {
return null;
}
}

调试时,如果关闭被取消,parent.CanRaiseEventsInternal为false。

所以......取消关闭表单的实际实现比以前的答案更复杂,但是他们关于如何正确取消您自己的事件的建议显示了如何在托管代码中执行此操作。调用 CancelEventHandler,然后在所有订阅者都有机会将值设置为 true 后测试 CancelEventArgs.Cancel 的值。这仍然不能回答如果一些订户设置 Cancel = false 和一些设置 Cancel = true 会发生什么。有人知道吗?是否需要以下内容?

public bool Cancel
{
get{ return this.cancel; }
set{ this.cancel = this.cancel || value; }
}

关于.net - EventArgs Cancel 如何在 FormClosing 事件中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1655414/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com