我认为原帖作者可能想知道当一些订阅者设置
Cancel = false
而另一些订阅者设置
Cancel = true
时会发生什么。如果是这种情况,则“表单何时处理此项”这个问题变得更加重要。
起初,我想知道setter是实现OR还是AND每个值。使用
Reflector检查
CancelEventArgs.Cancel
的setter显示它只设置一个私有字段:
public bool Cancel
{
get{ return this.cancel; }
set{ this.cancel = value; }
}
我想查看 'Form.OnClosing(CancelEventArgs args)' 的代码,以便确定何时检查该值,就像之前的答案一样,但是反编译器显示的并不是这样:
[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
委托会深入到窗口API中,因此当表单设置Cancel = true
时,OnClosing
的第一行中的handler
为null
,这意味着托管代码实际上从未测试过CancelEventArgs.Cancel == true
。如果您想要查看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; }
}