动态按钮onclick问题

时间:2013-09-09 19:58:54

标签: c# asp.net loops button

我有以下代码:

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

1 个答案:

答案 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);
    }