为什么不能 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仅重定向页面)。
为什么按钮在循环内不起作用,为什么它在循环外工作?
循环中的所有按钮都具有相同的 ID,因为您不会递增ItemCounter
。 虽然你可以改用i
,但你似乎根本没有使用ID
,所以你最好不要首先设置它。
另请记住,在回发时,需要创建按钮并将其添加到 PreInit
事件中的页面,以便事件处理程序能够运行。
动态创建控件(尤其是具有后续回发处理程序的控件)可能非常棘手。 需要来自请求的数据才能生成控件,但需要在 ASP 处理请求以触发事件之前生成控件的情况并不少见。 创建将数据绑定到的模板要容易得多,改用GridView
或Repeater
之类的东西,因为它能够在处理请求之前正确处理重新创建控件,同时仍然允许您拥有模板的动态实例数。
**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);
}
}