2009-04-26 3 views
4

EventArgsの拡張がどのように役立つか分かりません。クラス継承を持つEventArgsですが、それは便利ですか?

public class ClickedEventArgs : EventArgs { 
    int x; 
    int y; 
    public ClickedEventArgs (int x, int y) { 
    this.x = x; 
    this.y = y; 
    } 
    public int X { get { return x; } } 
    public int Y { get { return y; } } 
} 

コードは上記です。どのように私はこの継承を使用することができますか?私はここで

+0

これはASP.NETのシナリオでは必ずしも例が見つかりません。クリックの正確な位置を取得する場合は、Windowsフォーム/ WPFではかなり一般的です。 Webアプリケーションでは、この種のイベントは通常、JavaScriptを介してクライアント側で処理されます。 PostBackのJavaScriptからこれらの情報を渡すカスタムコントロールを作成することは可能だと思います。 –

答えて

2

のdefault.aspxからこのコードのブログを呼び出すことができる方法を学びたいあなたのコードを使用する方法の例である:それはでEventArgsから派生すると便利ですなぜ

public class MyClass() {   
    public event EventHandler<ClickedEventArgs> ClickedEvent = delegate {}; //Register the event 

    protected void SomethingWasClicked(int x, int y) {  
     ClickedEvent(this, new ClickedEventArgs(x,y)); //Invoke the event that is subscribed to 
    } 

} 

public class AnotherClass() { 

    public AnotherClass() { 
     MyClass mClass = new MyClass(); 
     mClass.ClickedEvent += new EventHandler(mClass_clickedEvent); 
    } 

    protected void mClass_clickedEvent(object sender, ClickedEventArgs e) { 
     //Retrieve the X parameter that was passed from the MyClass instance 
     int x = e.X; 
    } 
} 
12

あなたが求めています最初の場所? C#1では、デリゲート変換が機能するため、多くの意味がありませんでしたが、C#2ではより合理的です。これにより、イベント引数の詳細を気にしなくても、イベントハンドラをイベントに登録することができます。例えば

void LogEvent(object sender, EventArgs e) 
{ 
    Console.WriteLine("Event sent from " + sender); 
} 

... 

textArea.KeyPress += LogEvent; 

これはControl.KeyPressはタイプKeyPressEventHandlerのイベントであっても動作します。 C#と.NETはLogEventの署名がの正確にと一致していないことに気付かないでください。署名はKeyPressEventHandlerと一致します。我々はすべてのEventArgsを持っている(あなただけobjectを使用することができます)が、EventArgsクラスとパターンを与えられなかった場合

確かにこれはまだ実現可能になり、それがEventArgsから独自のイベント引数を導き出すことは理にかなっています。

+3

EventArgsには、単にオブジェクトを使用する場合に比べて非常に優位な利点があります。署名(オブジェクト、オブジェクト)を持つデリゲートは、コードの誤植のためにエラーが発生しやすくなります。 (オブジェクト、EventArgs)の署名では、このようなタイプミスはコンパイル時に発見される可能性が非常に高いです。 – AnthonyWJones

+0

真、はい。私はこれまで考えなかった。これはちょっと奇妙なことです... –

+0

OhとEventArgs には、EventArgsから派生させる必要がある独自のハンドラタイプを宣言する代わりに、このGenericを使用する場合は、TEventArgs:EventArgsのどこになりますか。 – AnthonyWJones

2

ここで本当に重要なことは、イベントを後で簡単にアップグレードして、詳細を把握し、既存の分離されたリスナーを壊さないことです。

関連する問題