我在Windows窗体数据网格视图中有一个二维数组的按钮。当用户单击按钮时,我想将按钮的x,y位置传递给执行其他任务的函数。目前,我正在使用在表单加载上运行的代码:
for (int x = 0; x < 8; x++)
{
for (int y = 0; y < 8; y++)
{
BoardButtons[x, y] = new Button();
Controls.Add(BoardButtons[x, y]);
BoardButtons[x, y].Visible = true;
BoardButtons[x, y].Click += (s, ev) =>
{
MyFunction(x, y);
};
}
}
但是,每次单击表单中的按钮时,它总是将8作为x,y坐标传递给函数。只是想知道我的代码是否有问题?。
答案 0 :(得分:4)
这是因为闭包。
基本上,因为在for循环结束后调用了click事件子方法,所以x和y变量都是8。
试试这个:
for (int x = 0; x < 8; x++)
{
for (int y = 0; y < 8; y++)
{
BoardButtons[x, y] = new Button();
Controls.Add(BoardButtons[x, y]);
BoardButtons[x, y].Visible = true;
int tmpX = x;
int tmpY = y;
BoardButtons[x, y].Click += (s, ev) =>
{
MyFunction(tmpX, tmpY);
};
}
}