我正在尝试使用for-statement以编程方式添加一些按钮。
我希望完成的是,每个按钮都会在内部使用迭代器值发射点击事件。
这是我的代码的示例:
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。
如何完成发送迭代器的每个值?
button1->单击 -> foo(0)
button2->单击 -> foo(1)
...等等。
您属于闭合陷阱。改用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));
}
}
您可以像这样的按钮添加标签
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;
}
这是一个众所周知的问题,实际上很难找到(我找不到简单的东西,因此写一个答案)。更改您的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
}