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是的,我在回答中提到了这一点。这就是为什么您首先应该避免像这样动态创建控件。改用
中继器
。似乎中继器是最好的解决方案。谢谢