2009-10-08 10 views
11

イベントSystem.ComponentModel.CancelEventArgsはどのように使用できますか?どのように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(少なくとも)で使用されることがあります。すべての値を取得することはできない場合、イベントの加入者は1人だけですか?別途、あなたがリストにアクセスする必要がある各加入者に依頼すること

答えて

7

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

次に、あなたが順番にそれぞれを確認することができます。さもなければあなたは最終投票を得るだけです。

+0

ちょうどこれ!ありがとう – FerranB

+0

投票ではありません。 (私はそれがフレーズの転換であることを認識していますが、それは誤解される可能性があります)。いずれかのサブスクライバが[キャンセル]をtrueに設定すると、最後にtrueになります。以前のサブスクライバを無効にするため、サブスクライバは[キャンセル]を[偽]に設定しないでください。 –

6

通常、ほとんどの場合、クラスは複数のサブスクライバを許可しますが、それぞれはCancelEventArgsの同じインスタンスを取得します。

サブスクライバのいずれかが[キャンセル]をtrueに設定すると、その操作はキャンセルされたものとして扱われます。

これを回避するには、呼び出しリストを取得し、各サブスクライバにイベントを送信することができますが、これは通常は必要ありません。

+3

e.Cancel =(条件)としてコードを使用するのは非常に簡単です。それで誰もがこれを尊重するとは考えられません。 – FerranB

関連する問題