我正在尝试使用for-statement以编程方式向控件添加一些按钮。
我希望实现的是每个按钮都会使用迭代器值激活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);
}
}
在我的场景中,它使用迭代器的最后一个值初始化Foo,即4。
如何完成发送迭代器的每个值?
Button1-&GT;点进&GT;美孚(0)
Button2-&GT;点进&GT;美孚(1)
......等等。
答案 0 :(得分:2)
你陷入了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 :(得分:0)
您可以像这样添加标签
for(int i = 0; i < 5; ++i)
{
var button = new Button();
button.Tag = i;
button.Click += Button_Click();
}
然后将对象发送者转发回Button以接收标记
private void Button_Click(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
var tag = (int)button.Tag;
}
答案 2 :(得分:-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
}