2016-12-13 3 views
-1

for文を使用してプログラムでコントロールにいくつかのボタンを追加しようとしています。C# - ボタンのクリックイベントプログラム的に反復

私が達成したいのは、すべてのボタンが反復子の値を持つクリックイベントを発生させるということです。ここで

は、私のコードの例である:私のシナリオで

public class Foo 
{ 
    public Foo(int val) 
    { 
    //Do something with val 
    } 
} 

//for-statement 
for(int i = 0; i < 5; ++i) 
{ 
    var button = new Button(); 
    button.Click += (sender, e) => 
    { 
     var text = new Foo(i); 
    } 
} 

それがあること4.

がどのように私はすべての値を送信するために達成することができますことを、イテレータの最後の値ではFooをintializesイテレータ?

Button1->クリック - >フー(0)

Button2->クリック - >フー(1)

...というように。

+0

あなたは何を試しましたか? – BugFinder

+0

'public class ValueWrapper ここで、T:struct {T _Value;パブリックT値{get {return _Value; }セット{_Value =値; }} public ValueWrapper (Tの初期値){_Value =初期; }} 'を使用し、次に' var @int = new ValueWrapper (i);を使用します。 button.Click + =(sender、e)=> {var text = @int; }; ' –

+1

この質問を参照してください:https://stackoverflow.com/questions/2226510/closures-in-c-sharp-event-handler-delegates –

答えて

1

あなたはclosuresのトラップに入ります。代わりにButton.Tagを使用してください。

public class Foo 
{ 
    public Foo(int val) 
    { 
    //Do something with val 
    } 
} 

//for-statement 
for(int i = 0; i < 5; ++i) 
{ 
    var button = new Button(); 
    button.Tag = i; 
    button.Click += (sender, e) => 
    { 
     var text = new Foo((int)((sender as Button).Tag)); 
    } 
} 
-1

それは(私はそのための答えを書いて、簡単な何かを見つけることができない)、実際に見つけるのは難しいですこれは、よく知られた問題です。内側のループ変数の値をキャプチャするためにあなたのforを変更します。

for(int i = 0; i < 5; ++i) 
{ 
    var current = i; // capture ('for' scope local variable to hold current value of i) 
    var button = new Button(); 
    button.Click += (sender, e) => var text = new Foo(current); // don't use i here 
} 
0

あなたがタグ

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var button = (Button)sender; 
    var tag = (int)button.Tag; 
} 
を受け取るために、[戻る]ボタンへのオブジェクトの送信者をこの

for(int i = 0; i < 5; ++i) 
{ 
    var button = new Button(); 
    button.Tag = i; 
    button.Click += Button_Click(); 
} 

のようなあなたのボタンにタグを追加し、キャストすることができます