C# - 按钮单击事件,以编程性迭代



我正在尝试使用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
}

最新更新