2012-04-19 6 views
0

新しく作成されたEventHandlerで変数を送信するにはどうすればよいですか?C#EventHandlerで変数を送信していますか?

for (int i = 0; i < 5; i++) 
{ 
    Button buttonX = new Button(); 
    buttonX.Location = new Point(0, 0 + offset); 
    buttonX.Size = new Size(310, 48); 
    buttonX.Click += new EventHandler(buttonClick); 
} 

private void buttonClick(object sender, EventArgs e) 
{ 
    MessageBox.Show(); 
} 

buttonX.Click += new EventHandler(buttonClick , i); 

private void buttonClick(object sender, EventArgs e, int i) 
{ 
    MessageBox.Show(i.toString()); 
} 
+0

標準のボタンで動作させたい場合は、できません。ただし、必要な最終結果を説明できる場合は、別の方法があります。それで、あなたは何をしようとしていますか?私は何ですか? – JMarsch

答えて

1

あなたが欲しいの追加データポイントを運ぶのEventArgsから派生したクラスを作成します。だから、

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

だけではなく、あなたがraingしているイベントのためにEventArgsを作成しているEventArgsを使用します。

public class ButtonClickedEventArgs : EventArgs 
{ 
    public int EventInteger { get; private set; } 

    public ButtonClickedEventArgs(int i) 
    { 
     EventInteger = i; 
    } 
} 

イベントを発生させると、ButtonClickedEventArgsクラスが作成され、EventHandlerに渡されます。

+0

彼はイベントを発生させず、.NET提供の 'Button'クラスは... –

7

クロージャは壮大あるようにどのように私はそれを行うことができますすることができます:私が持っている コードのようなものです。

buttonX.Click += (sender, e) => buttonClick(sender, e, i); 

または匿名デリゲート表記:

buttonX.Click += delegate (object sender, EventArgs e) { buttonClick(sender, e, i); }; 

しかし、you're going to have trouble if you capture the loop variableあなたは、ラムダ表記を使用することができます。

代わりに、あなたがそれを行うことはできません

for (int i = 0; i < 5; i++) 
{ 
    Button buttonX = new Button(); 
    buttonX.Location = new Point(0, 0 + offset); 
    buttonX.Size = new Size(310, 48); 
    var i_copy = i; 
    buttonX.Click += (sender, e) => buttonClick(sender, e, i_copy); 
} 
+1

私はパンチに私を打ちました;-) – BrokenGlass

+0

D: – log

1

を行いますが、何を行うことができ、中間ラムダ使用です:ちょうどTag性質を利用、あなたのシナリオを考える

for (int i = 0; i < 5; i++) 
{ 
    int j = i; // Need to do this to fix closure issue 

    Button buttonX = new Button(); 
    buttonX.Location = new Point(0, 0 + offset); 
    buttonX.Size = new Size(310, 48); 
    buttonX.Click += (sender, e) => { 
     buttonClick(sender, e, j); 
    }; 
} 


private void buttonClick(object sender, EventArgs e, int i) 
{ 
    MessageBox.Show(i.toString()); 
} 
+1

ループ変数のコピーを作成するときは実際にコピーを使用してください: –

+0

@BenVoigt:それを指摘してくれてありがとう: ) – Ryan

+0

あなたの閉鎖の問題については、 'i'の代わりに' j'をハンドラに渡すべきではありませんか? – BeemerGuy

2

を。ソリューションをClickイベントと混在させないでください。イベントに毎回iを渡す必要はありません。それは常に同じであるため、コントロールにタグを付けるだけです。あなたは閉鎖を心配する必要はありません。

これにあなたのコードを変更

for (int i = 0; i < 5; i++) 
{ 
    Button buttonX = new Button(); 
    buttonX.Location = new Point(0, 0 + offset); 
    buttonX.Size = new Size(310, 48); 
    buttonX.Click += new EventHandler(buttonClick); 
    buttonX.Tag = i; 
} 

private void buttonClick(object sender, EventArgs e) 
{ 
    MessageBox.Show(((Button)sender).Tag.ToString()); 
} 
関連する問題