为什么 asp.net 动态按钮不能循环触发?

Why can't asp.net dynamic button fire in loop?

所以我发现了这个涉及动态按钮的非常令人费解的问题。

这是我创建按钮的方法:

private void CreateButtons()
{
    //Button outside loop works
    Button selectItem = new Button();
    selectItem.Text = "Hello World";
    selectItem.ID = "btn";
    selectItem.Click += selectItem_Click;
    PlaceHolder1.Controls.Add(selectItem);

    int ItemCounter = 0;
    for (int i = 0; i < BillDate.Count; i++)
    {   //Button inside loop doesnt work
        ItemCounter++;
        Button selectItem = new Button();
        selectItem.Text = "Hello World";
        selectItem.ID = "btn-" + ItemCounter.ToString();
        selectItem.Click += selectItem_Click;

        PlaceHolder1.Controls.Add(selectItem);
    }
}

问题来了, 在循环外创建的按钮工作正常(事件处理程序 selectItem_Click 仅重定向页面)。

为什么按钮在循环内不起作用,为什么在循环外起作用?

循环中的所有按钮都具有相同的 ID,因为您没有递增 ItemCounter。虽然您可以只使用 i,但您似乎根本没有使用 ID,所以最好不要一开始就设置它。

还要记住,在 post 后面,需要在 PreInit 事件中创建按钮并将其添加到页面,以便事件处理程序能够 运行.

动态创建控件,尤其是在后续 postbacks 上具有处理程序的控件,可能非常棘手。需要来自请求的数据才能生成控件的情况并不少见,但需要在 ASP 处理请求之前生成控件才能触发事件。使用 GridViewRepeater 之类的东西来创建绑定数据的模板要容易得多,因为它将能够在处理请求之前正确处理重新创建控件同时仍然允许您拥有动态数量的模板实例。

     **Use the below code it will work.**

        private void CreateButtons()
        {
            //Button outside loop works
            Button selectItem = new Button();
            selectItem.Text = "Hello World";
            selectItem.ID = "btn";
            selectItem.Click += selectItem_Click;
            PlaceHolder1.Controls.Add(selectItem);

            int ItemCounter = 0;
            for (int i = 0; i < BillDate.Count; i++)
            {   //Button inside loop doesnt work
                Button selectItem = new Button();
                selectItem.Text = "Hello World";
                selectItem.ID = "btn-" + ItemCounter.ToString();
                selectItem.Click += selectItem_Click;
                ItemCounter++;
                PlaceHolder1.Controls.Add(selectItem);
            }
        }