我有以下代码:
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 1; i < 5; i++)
{
Button btn = new Button();
btn.ID = "button-" + i.ToString();
btn.Text = "This is button-" + i.ToString();
btn.Click += (senders, es) => test(i, PlaceHolder1, btn.ID);
PlaceHolder1.Controls.Add(btn);
}
}
protected void test(int num, PlaceHolder ph, string btnID)
{
Response.Write("The Button clicked on is: " + num);
}
现在由于某种原因,我似乎无法弄清楚,当我点击任何按钮时,传递的变量“num”的数字总是5.有谁知道为什么会发生这种情况?或者为什么它不将它应该的实际数字分配给“num”?
答案 0 :(得分:4)
你正在关闭循环变量。当您创建使用i
的lambda时,它不会在该时间点获取i
的副本,它会捕获该变量并确保i
的值,当该lambda时被调用,是什么使用。当这些匿名方法实际执行时,循环早已结束,因此该时间点i
的值为5
。
修复很简单,而不是让所有5个按钮都引用一个变量,通过获取值的副本确保每个按钮都有自己的变量来引用:
for (int i = 1; i < 5; i++)
{
var temp = i;
Button btn = new Button();
btn.ID = "button-" + i.ToString();
btn.Text = "This is button-" + i.ToString();
btn.Click += (senders, es) => test(temp, PlaceHolder1, btn.ID);
PlaceHolder1.Controls.Add(btn);
}