2009-10-08 16 views
11

Wie kann das Ereignis System.ComponentModel.CancelEventArgs verwendet werden? Angenommen, wir haben den folgenden Code:Wie können Ereignisse wie CancelEventArgs verwendet werden?

public event CancelEventHandler EventTest = delegate { }; 

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

Was passiert, wenn mehr als ein Delegat für die Veranstaltung registriert ist? Gibt es eine Möglichkeit, die Ergebnisse aller Abonnenten zu erhalten?

Dies wird manchmal (zumindest) auf Winforms verwendet. Wenn es nicht möglich ist, alle Werte zu erhalten, nehmen sie nur einen Teilnehmer für das Ereignis an?

Antwort

7

jeden Teilnehmer separat fragen Sie die Liste zugreifen müssen:

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

Dann können Sie die jeweils wiederum überprüfen; sonst erhältst du nur die Schlussabstimmung.

+0

Nur das! Danke – FerranB

+0

Es ist keine Stimme. (Ich weiß, das war eine Wendung, aber es könnte fehlinterpretiert werden.) Wenn ein Abonnent Cancel auf true setzt, ist es am Ende wahr. Kein Abonnent sollte Cancel auf false setzen, da dies einen vorherigen Abonnenten außer Kraft setzen würde. –

6

Normalerweise erlaubt die Klasse in den meisten Fällen nur mehrere Abonnenten, aber alle erhalten dieselbe Instanz von CancelEventArgs.

Wenn einer der Abonnenten Cancel auf true setzt, wird der Vorgang als abgebrochen behandelt.

Sie können dies umgehen, indem Sie die Aufrufliste abrufen und ein Ereignis an jeden Abonnenten senden, aber das ist normalerweise nicht notwendig.

+3

Es ist sehr einfach, dass die Abonnenten Code als e.Cancel = (Bedingung) verwenden, dann können Sie nicht annehmen, dass jeder dies respektieren wird. – FerranB

Verwandte Themen