EventArgs取消如何在FormClosing事件中工作?

时间:2009-10-31 19:48:41

标签: .net winforms event-handling eventargs

e.Cancel事件如何在WinForm上的FormClosing事件中工作?我知道你将它设置为True取消关闭,但是表单在什么时候处理这​​个?该物业是否采取了次要行动?

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

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

3 个答案:

答案 0 :(得分:7)

我认为原始海报可能想知道当某些订阅者设置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)'会在检查值时显示,就像之前的答案一样,但这不是Reflector所显示的:

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

所以我启用了源代码调试,发现从EVENT_CLOSING集合中Events代理深入到窗口API,handler第一行OnClosing当表单设置null时,Cancel = trueCancelEventArgs.Cancel == true,这意味着托管代码永远不会真正测试get { ListEntry e = null; if (parent == null || parent.CanRaiseEventsInternal) { e = Find(key); } if (e != null) { return e.handler; } else { return null; } } 。如果你想要了解EventHandlerList内部发生的丑陋内容,你会得到:

parent.CanRaiseEventsInternal

调试时,如果结束取消,CancelEventArgs.Cancel为假。

所以......取消表单关闭的实际实现比之前的答案更复杂,但他们对如何正确取消自己的事件的建议显示了如何在托管代码中执行此操作。在所有订阅者都有机会将值设置为true之后,调用CancelEventHandler然后测试Cancel = false的值。如果某些订阅者设置了Cancel = true而某些订阅者设置了public bool Cancel { get{ return this.cancel; } set{ this.cancel = this.cancel || value; } } ,则仍然无法回答这种情况。有人知道吗?是否需要以下内容?

{{1}}

答案 1 :(得分:2)

遵循Windows窗体中使用的标准事件生成模式:

public event CancelEventHandler MyEvent;

protected void OnMyEvent(CancelEventArgs e) {
  CancelEventHandler handler = MyEvent;
  if (handler != null) {
    handler(this, e);
  }
}

private void button1_Click(object sender, EventArgs e) {
  CancelEventArgs args = new CancelEventArgs();
  OnMyEvent(args);
  if (!args.Cancel) {
    // Client code didn't cancel, do your stuff
    //...
  }
}

答案 2 :(得分:0)

function OnMyCancelableEvent()
{
   var handler = CancelableEvent;
   var args = new CancelEventArgs()
   if(handler != null)
   {
        handler(this, args)
        if(args.Canceled)
           // do my cancel logic
        else
           // do stuff
   }
}