gpt4 book ai didi

c# - Lambda 表达式在设置某些控件的事件处理程序时不起作用

转载 作者:行者123 更新时间:2023-11-30 14:02:12 25 4
gpt4 key购买 nike

我正在创建一个控件数组并将它们添加到表单中,并将它们的事件设置为一个函数,该函数使用 lambda 表达式 (b.Click += (sender, e ) => myClick(i);).

但问题是...无论您点击哪个,您都会收到索引 100,而不是按钮的实际索引!这里有什么问题?

namespace testArrayOfControls
{

public partial class Form1 : Form
{
Button[] buttons;

public Form1()
{
InitializeComponent();
buttons = new Button[100];
for (int i = 0; i < 100; i++)
{
buttons[i] = new Button();
buttons[i].SetBounds(i % 10 * 50, i / 10 * 50, 50, 50);
buttons[i].Click += (sender, e) => myClick(i);
this.Controls.Add(buttons[i]);
}
}

private void myClick(int i)
{
MessageBox.Show(i.ToString());
}

}
}

最佳答案

问题是您在循环变量 i 上创建了闭包。在将它传递给事件处理程序之前,您需要在本地(在 for 循环内)复制它。

for (int i = 0; i < 100; i++)
{
var index = i; // YOU NEED TO DO THIS
buttons[i] = new Button();
buttons[i].SetBounds(i % 10 * 50, i / 10 * 50, 50, 50);
buttons[i].Click += (sender, e) => myClick(index); // THIS SOLVES THE PROBLEM
this.Controls.Add(buttons[i]);
}

解释

你正在定义这样一个函数:

(sender, e) => myClick(i)

此函数(将在未来的某个时刻运行,当单击按钮时)包含对 i 的引用。方法是,它会在点击发生时使用 i 的值,而不是在定义函数时使用。

到那时,i 的值显然会变成 100。

该解决方案有效,因为它使函数引用变量 index 而不是 iindexi 的不同之处在于 i 是一个值会改变的变量,而 index 是我们使用的名称100 个不同的变量(每个循环迭代一个),其值保持不变

关于c# - Lambda 表达式在设置某些控件的事件处理程序时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6439477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com