问题 如何使用像CancelEventArgs这样的事件?


活动怎么样? System.ComponentModel.CancelEventArgs 使用?假设我们有以下代码:

    public event CancelEventHandler EventTest = delegate { };

    public void MakeSomethingThatRaisesEvent()
    {
        CancelEventArgs cea = new CancelEventArgs();
        EventTest(this, cea);
        if (cea.Cancel)
        {
            // Do something
        }
        else
        {
            // Do something else
        }
    }

如果在活动中注册了多个代表,会发生什么?有什么办法可以获得所有订阅者的结果吗?

这有时用于Winforms(至少)。如果不能获得所有值,他们只假设该事件的一个订户?


11916
2017-10-08 17:25


起源



答案:


要单独询问每个订户,您需要访问该列表:

foreach (CancelEventHandler subHandler in handler.GetInvocationList())
{
     // treat individually
}

然后你可以依次检查每一个;否则你只是得到最后的投票。


7
2017-10-08 17:27



只是这个!谢谢 - FerranB
这不是投票。 (我意识到这是一个转折,但它可能会被误解。)如果任何订阅者将Cancel设置为true,那么最后它是真的。没有订阅者应将Cancel设置为false,因为这会覆盖以前的订阅者。 - Ian Goldby


答案:


要单独询问每个订户,您需要访问该列表:

foreach (CancelEventHandler subHandler in handler.GetInvocationList())
{
     // treat individually
}

然后你可以依次检查每一个;否则你只是得到最后的投票。


7
2017-10-08 17:27



只是这个!谢谢 - FerranB
这不是投票。 (我意识到这是一个转折,但它可能会被误解。)如果任何订阅者将Cancel设置为true,那么最后它是真的。没有订阅者应将Cancel设置为false,因为这会覆盖以前的订阅者。 - Ian Goldby


通常,在大多数情况下,该类只允许多个订阅者,但每个订阅者都获得相同的CancelEventArgs实例。

如果任何订户将Cancel设置为true,则该操作将被视为已取消。

您可以通过获取调用列表并向每个订阅者发送事件来解决此问题,但这通常不是必需的。


6
2017-10-08 17:29



订阅者使用代码作为e.Cancel =(条件)非常容易,那么你不能认为每个人都会尊重这一点。 - FerranB