2017-09-16 17 views
0

私は非常に初心者で、イベントハンドリングの詳細を把握しようとしています。そして、私は頭を悩ませている。以下を参照してください:ハンドラメソッドの引数がうまくいくように見えますが、デリゲートのEventHandlerに一致するオーバーロードはありません

public class Knop_ClickEventArgs : System.EventArgs 
{ 
    //Here comes code that still needs to be written. 
} 

static void Knop_Click(object sender, Knop_ClickEventArgs e) 
{ 
    Canvas canvas = new Canvas(); 
    Application.Run(canvas); 
} 

public PromptScherm() 
{ 
    //Deleted some code here that is most likely uninteresting 

    Button Knop = new Button(); 

    // Deleted uninteresting code here as well 

    this.Controls.Add(Knop); 

    Knop.Click += Knop_Click; 

} 

このコード(短縮)作品はCS0123エラーを与え、私のKnop_Click方法は、デリゲートEventHandlerと一致しないことを記述する。

問題がKnop_ClickEventArgsであることがわかりました。それをSystem.EventArgsと置き換えるとうまくいきます。しかし、Knop_ClickEventArgsという定義では、それがSystem.EventArgsの特定のインスタンスであることを指定しているので、それはなぜ問題を引き起こすのだろうと私に困惑しますか?

+0

'Click'ハンドラはすべての可能な' EventArgs'を処理できるはずですが、 'Knop_Click'は' Knop_ClickEventArgs'しか処理できません。 – PetSerAl

+0

EventArgsインスタンスを暗黙的にKnop_ClickEventArgsに変換することはできません。おそらく、あなたはボタンを継承し、カスタムイベント引数サポートのためにクリックをオーバーライドする必要があります。詳細についてはhttps://stackoverflow.com/questions/4815629/how-do-i-pass-variables-to-a-buttons-event-methodを参照してください – ingvar

+0

あなたはwinformsを使用していますか? –

答えて

0

すべてが間違っています。 Clickイベントに適切なイベントハンドラが必要です。

static void Knop_Click(object sender, EventArgs e) 
{ 
} 
// ... 
Knop.Click += Knop_Click; 

このメソッドは、ButtonがClickイベントを発生したときに呼び出されます。ボタンがこのイベントをどのように発生させるのかという理由で署名を変更することはできません。このようなもの。

Click.Invoke(this, EventArgs.Empty); // "this" refers to button it self. 

Knop_Clickには、ボタンが渡されたばかりの引数があります。

static void Knop_Click(object sender, EventArgs e) 
{ 
    var btn = (Button)sender; 
    // do some logic. 
} 

ここで、署名を変更するとどうなりますか? EventArgsは基本クラスであり、ButtonはEventArgsを渡しているので、派生クラスに変換することはできません。

あなたの目標は何かを明確にする必要があります。

2

あなたはButtonがそれobject sender, System.EventArgs eを渡すあなたのハンドラを呼び出すされます(この場合には、あなたがKnopを呼び出すButton)を、コントロールのClickイベントにハンドラを追加します。コンパイラはあなたがそうすることを許可された場合

  • ので、あなたは本当のトラブルになり、

  • 、代わりにSystem.EventArgsの独自のイベントクラスを受け入れるよう、あなたのハンドラを定義することは不可能である:これは、ことを意味しButtonはまだSystem.EventArgsをあなたのハンドラに渡しているので、代わりに何か他のものを受け取ることを完全に無視しています。

あなたのイベントクラスにコードを追加するというあなたの計画は、おそらくあなたは、イベントとイベント・パッシングについて理解していないものがあることを私に伝えます。イベントはデータを運ぶことになっていますが、コードは含まれていません。