views:

247

answers:

2

Ho can the event System.ComponentModel.CancelEventArgs be used? Suppose we have the following code:

    public event CancelEventHandler EventTest = delegate { };

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

What happens if more than one delegate is registered on the event? There is any way to get the results of all the subscribers?

This is used on Winforms (at least) sometimes. If not possible to get all values, they suppose only one subscriber to the event?

+1  A: 

To ask each subscriber separately, you need to access the list:

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

Then you can check each in turn; otherwise you just get the final vote.

Marc Gravell
Just this! Thanks
FerranB
+2  A: 

Normally, in most cases, the class just allows multiple subscribers, but each gets the same instance of CancelEventArgs.

If any of the subscribers set Cancel to true, the operation will be treated as canceled.

You can work around this by getting the invocation list, and sending an event to each subscriber, but this is not usually necessary.

Reed Copsey
It's very easy that the subscribers use code as e.Cancel = (condition), then you cannot suppose that everyone is going to respect this.
FerranB