C# 为什么可以';asp.net动态按钮在循环中触发?
所以我发现这个非常令人困惑的问题,涉及到动态按钮 以下是我创建按钮的方法:C# 为什么可以';asp.net动态按钮在循环中触发?,c#,asp.net,C#,Asp.net,所以我发现这个非常令人困惑的问题,涉及到动态按钮 以下是我创建按钮的方法: private void CreateButtons() { //Button outside loop works Button selectItem = new Button(); selectItem.Text = "Hello World"; selectItem.ID = "btn"; selectItem.Click += selectItem_Click; P
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);
}
}
private void CreateButtons()
{
//按钮外循环工作
Button selectItem=新建按钮();
选择item.Text=“Hello World”;
选择item.ID=“btn”;
selectItem.Click+=selectItem\u单击;
占位符1.控件。添加(选择项);
int ItemCounter=0;
对于(int i=0;i
现在问题来了,
在循环外部创建的按钮工作正常(事件处理程序selectItem\u单击仅重定向页面)
为什么按钮不在循环内工作,为什么它在循环外工作?循环中的所有按钮都具有相同的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);
}
}
私有void CreateButtons()
{
//按钮外循环工作
Button selectItem=新建按钮();
选择item.Text=“Hello World”;
选择item.ID=“btn”;
selectItem.Click+=selectItem\u单击;
占位符1.控件。添加(选择项);
int ItemCounter=0;
对于(int i=0;i
因为在回发期间页面加载上不存在该按钮,最有可能的原因是您确定PreRender
,或者您正在考虑PreInit
?我在这里看到了解决方案,该按钮必须在PreInit中启动。但是如果。。“我的动态”按钮是根据用户定义的列表创建的。在PreInit调用CreateButtons时,此时按钮列表为空point@BloopieBloops是的,我在回答中提到了这一点。这就是为什么您首先应该避免像这样动态创建控件。改用中继器
。似乎中继器是最好的解决方案。谢谢