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

本文关键字:循环 按钮 动态 不能 asp net 为什么 | 更新日期: 2023-09-27 18:36:23

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

这是我创建按钮的方法:

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仅重定向页面)。

为什么

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

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

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

另请记住,在回发时,需要创建按钮并将其添加到 PreInit 事件中的页面,以便事件处理程序能够运行。

动态创建控件(尤其是具有后续回发处理程序的控件)可能非常棘手。 需要来自请求的数据才能生成控件,但需要在 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);
            }
        }