如何在一个WinForm的的FormClosing事件e.Cancel事件的工作?我知道你将它设置为True取消关闭,但在什么时候做表格的过程呢?有酒店所采取的辅助动作?

我怎么能实现自定义的控制类似的行动呢? (C#或C ++)

注意:我已经看了约30分钟,现在无法找到谷歌或SO搜索任何答案,所以如果它是一个重复的,是我不好。

有帮助吗?

解决方案

我觉得楼主可能想知道,当一些用户设置Cancel = false和一些用户设置Cancel = true会发生什么。如果是这种情况,那么这个问题:“当确实形式处理这个”承担更多的重要性。

起初我想知道设定器是否被实现为OR或AND每个值。使用反射来检查CancelEventArgs.Cancel的setter显示它只是设置一个私有字段:

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

所以我偷看“Form.OnClosing(CancelEventArgs参数)”将显示在该值被选中时,像以前的答案,但是这不是什么反射器显示:

[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,使得handlerOnClosing的第一行是null当表单设置Cancel = true,这意味着托管代码从来没有真正测试是否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是假的。

所以...取消窗体的关闭的实际执行情况比以前的答案比较复杂,但他们对如何取消自己的事件的建议正确显示如何做到这一点的托管代码。调用CancelEventHandler,然后所有的用户后进行测试CancelEventArgs.Cancel的价值有机会设定值true。这仍然没有回答,如果一些用户设置Cancel = false有的一套Cancel = true会发生什么。有人知道吗?会像下面这样要求?

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

其他提示

继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
    //...
  }
}
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
   }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top