C# - 按钮单击事件以编程方式迭代

时间:2016-12-13 11:15:35

标签: c# events button iterator click

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

......等等。

3 个答案:

答案 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
}