C#ASP-动态按钮创建和分配事件处理程序

C#ASP-动态按钮创建和分配事件处理程序,c#,asp.net,webforms,eventhandler,C#,Asp.net,Webforms,Eventhandler,我有几个下拉列表,根据用户选择,我必须在单个按钮[动态创建]中显示从SQL检索的结果。我有一个触发动态按钮创建的按钮点击事件 代码: void CreateButtons(string val) { Button btn = new Button(); btn.Text = val; Panel1.Visible = true; btn.ID = val.Replace(" ", "_"); btn.Click +=

我有几个下拉列表,根据用户选择,我必须在单个按钮[动态创建]中显示从SQL检索的结果。我有一个触发动态按钮创建的按钮点击事件

代码:

void CreateButtons(string val)
{
        Button btn = new Button();
        btn.Text = val;
        Panel1.Visible = true;
        btn.ID = val.Replace(" ", "_");
        btn.Click += new System.EventHandler(test);
        Panel1.Controls.Add(btn);
}


protected void Button1_Click(object sender, EventArgs e)
{
        int cont = 0;
        string[] names = new string[40];
        string del2 = "MY SQL STATEMENT"
        SqlCommand del1cmd2 = new SqlCommand(del2, conn);
        SqlDataAdapter da = new SqlDataAdapter(del1cmd2);
        DataTable dt = new DataTable();
        da.Fill(dt);
        foreach (DataRow row in dt.Rows)
        {
            names[cont] = row.Field<string>(0);
            CreateButtons(names[cont]);
        }
        Response.Write(names[cont]);
}
研究工作:
我已经查找解决方案很长一段时间了,我能够在页面加载中找到创建按钮的工作代码,但没有发现在按钮单击事件中创建动态按钮的类似情况。

需要在
页面初始化中重新创建动态控件

请尝试下面的示例进行测试

protected void Page_Init(object sender, EventArgs e)
{
  CreateButtons("1");
  CreateButtons("2");
}
下面是发生的情况

  • 有人点击按钮1。这会导致回发
  • ASP.Net接收POST请求,创建页面类的新实例(这是关键),并开始重新运行整个页面生命周期
  • 按钮1\u Click()
    代码作为页面生命周期的一部分运行,并将新按钮放入页面类中
  • Page类将HTML呈现给响应,浏览器在响应中接收HTML并将其呈现给用户的屏幕。此时,您在服务器上使用的页面类实例(包含所有新按钮的实例)被销毁。不过,这些按钮被渲染到浏览器中
  • 用户单击您的一个新按钮。这将导致新的回发
  • ASP.Net接收POST请求并创建Page类的新实例
  • 这就是事情变得一团糟的地方。Page类的新实例没有任何动态按钮

    每次回发都需要代码将这些按钮重新添加到类中。此外,ASP.Net页面寿命的事件处理程序是在页面加载事件之前确定的。因此,如果您等待页面加载来设置动态按钮,事情将无法正常工作。你会在屏幕上看到它们。您可以单击它们并强制回发(因为事件处理程序稍后将用于渲染步骤)。但是当你点击按钮时什么也不会发生

    要解决此问题,需要在Page_Init或Page_PreInit中(重新)创建按钮

    protected void Page_Init(object sender, EventArgs e)
    {
      CreateButtons("1");
      CreateButtons("2");
    }