【问题标题】:C# - Button Click Event Programmatically Iteration [duplicate]C# - 按钮单击事件以编程方式迭代[重复]
【发布时间】:2016-12-13 11:15:34
【问题描述】:

我正在尝试使用 for 语句以编程方式向控件添加一些按钮。

我希望完成的是每个按钮都会触发带有迭代器值的点击事件。

这是我的代码示例:

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->点击->Foo(0)

Button2->点击->Foo(1)

...等等。

【问题讨论】:

  • 你尝试了什么?
  • public class ValueWrapper&lt;T&gt; where T : struct { T _Value; public T Value { get { return _Value; } set { _Value = value; } } public ValueWrapper&lt;T&gt;(T initial) { _Value = initial; } } 然后使用var @int = new ValueWrapper&lt;int&gt;(i); button.Click += (sender, e) =&gt; { var text = @int; };
  • @PeterB,这是一个很好的(非常相似的)副本,感谢您的发现。

标签: c# events button iterator click


【解决方案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));
    }
}

【讨论】:

  • button.Click 事件最后也需要一个分号。
【解决方案2】:

您可以像这样向您的按钮添加标签

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

然后将 object sender 投射回 Button 以接收标签

private void Button_Click(object sender, RoutedEventArgs e)
{
    var button = (Button)sender;
    var tag = (int)button.Tag;
}

【讨论】:

    【解决方案3】:

    这是一个众所周知的问题,实际上很难找到(我找不到简单的东西,因此写了一个答案)。更改您的 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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-17
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      相关资源
      最近更新 更多