0

我有以下代码:

 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”?

4

1 回答 1

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);
    }
于 2013-09-09T20:01:36.890 回答