2016-12-13 3 views
-1

Я пытаюсь добавить некоторые кнопки в элемент управления программным путем, используя for-statement.C# - кнопка Click Event Programmatically Iteration

Что я хочу сделать, так это то, что каждая кнопка запускает событие click с итератором внутри.

Вот пример моего кода:

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); 
    } 
} 

В моих сценариях intializes Foo с последним значением итератора, что, будучи 4.

Как я могу выполнить, чтобы отправить каждое значение итератор?

Button1-> Нажать на> Foo (0)

Button2-> Нажать на> Foo (1)

... и так далее.

+0

Что вы попробовали? – BugFinder

+0

'public class ValueWrapper где T: struct {T_Value; public T Value {get {return _Value; } set {_Value = значение; }} public ValueWrapper (T initial) {_Value = initial; }} ', а затем используйте' var @int = new ValueWrapper (i); button.Click + = (отправитель, 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

Вы можете добавить тег на кнопки, как этот

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

А затем бросить объект отправителя обратно кнопку, чтобы получить тег

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var button = (Button)sender; 
    var tag = (int)button.Tag; 
} 
Смежные вопросы