2009-10-08 5 views
11

W jaki sposób można użyć zdarzenia System.ComponentModel.CancelEventArgs? Załóżmy, że mamy następujący kod:W jaki sposób można wykorzystać zdarzenia takie jak 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 
     } 
    } 

Co się stanie, jeśli w wydarzeniu zostanie zarejestrowanych więcej niż jeden uczestnik? Czy istnieje sposób na uzyskanie wyników wszystkich subskrybentów?

Czasami używa się tego na WinFormach (przynajmniej). Jeśli nie można uzyskać wszystkich wartości, zakładają one tylko jednego subskrybenta wydarzenia?

Odpowiedz

7

zapytać każdego abonenta oddzielnie, trzeba uzyskać dostęp do listy:

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

Następnie można sprawdzić po kolei; w przeciwnym razie otrzymasz ostateczne głosowanie.

+0

Po prostu to! Dzięki – FerranB

+0

To nie jest głosowanie. (Rozumiem, że był to zwrot, ale można go było źle zinterpretować.) Jeśli dowolny subskrybent ustawi opcję Anuluj na true, to na końcu będzie to prawda. Żaden subskrybent nie powinien ustawić wartości Anuluj na wartość false, ponieważ spowoduje to zastąpienie poprzedniego subskrybenta. –

6

Zazwyczaj w większości przypadków klasa pozwala wielu subskrybentom, ale każdy otrzymuje to samo wystąpienie Anuluj Zdarzenie.

Jeśli którykolwiek z subskrybentów ustaw Anuluj na true, operacja będzie traktowana jako anulowana.

Można obejść ten problem, pobierając listę wywołań i wysyłając zdarzenie do każdego subskrybenta, ale zazwyczaj nie jest to konieczne.

+3

To bardzo proste, że subskrybenci używają kodu jako e.Cancel = (warunek), wtedy nie można przypuszczać, że wszyscy będą to szanować. – FerranB