2009-06-09 5 views
1

私はイベントがあるとしましょう。 DoStuffと呼ぶことにしましょう。 DoStuffが発生する前に、別のイベントのPreviewDoStuffを使用して、DoStuffが呼び出されないようにする必要があるかどうかを確認しようとしています。私が直面している問題は、戻りコードやイベントの書き方など、PreviewDoStuffから何らかの価値を取り戻すことができないということです。そして、イベント引数は呼び出し側に返されないので、イベント引数 "処理済み"プロパティを取得できません。私はそれを行う方法がなければならないと確信していますが、私はどのように確かではありません。何か案は?メインイベントを取り消すことができる「プレビュー」タイプのイベントの書き方は?

ありがとうございます!

答えて

5

イベントをEventHandler<CancelEventArgs>と宣言します。リスナーは、Cancelをtrueに設定できます。この値を使用して、「実際の」イベントを発生させるかどうかを判断できます。

必須のコードサンプル:実際の使用で

public event EventHandler<CancelEventArgs> PreviewDoStuff; 
public event EventHandler DoStuff; 

private void RaiseDoStuff() 
{ 
    CancelEventArgs args = new CancelEventArgs(); 
    OnPreviewDoStuff(args); 
    if (!args.Cancel) 
    { 
     OnDoStuff(EventArgs.Empty); 
    } 
} 

protected void OnPreviewDoStuff(CancelEventArgs e) 
{ 
    EventHandler<CancelEventArgs> previewDoStuff = PreviewDoStuff; 
    if (previewDoStuff != null) 
    { 
     previewDoStuff(this, e); 
    } 
} 

protected void OnDoStuff(EventArgs e) 
{ 
    EventHandler doStuff = DoStuff; 
    if (doStuff != null) 
    { 
     doStuff(this, e); 
    } 
} 

本の例については、順番にCancelEventArgsから継承FormClosingEventArgsクラスを使用していますFormClosingイベントを、確認してください。

0

あなたのPreviewDoStuffは、DoStuffが起動時にチェックする内部フラグを設定します。さらに、DoStuffを生成するコードでイベントを発生させる前にフラグをチェックするようにしてください。

0

DoStuffという独自のイベントを作成したいと思っています。

public delegate void PreviewDoStuffFunc(ref bool Handled); 
public event PreviewDoStuffFunc PreviewDoStuff; 

しかし、標準的な方法は、CancelEventArgsのようなものを使用することです:私は「REF」引数を渡すことも可能だと思う

public event CancelEventArgs PreviewDoStuff; 
public event EventArgs DoStuff; 

次にプレビューイベントを発生した後、あなたがキャンセルを確認してください。

var e = new CancelEventArgs();  
if (PreviewDoStuff != null) 
    PreviewDoStuff(this, e); 
if (!e.Cancel) 
    DoStuff(this, EventArgs.Empty);