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

C# ASP - Dynamic button creation and assigning event handlers

我有几个下拉列表,根据用户的选择,我必须在 [动态创建] 的各个按钮中显示从 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]);
}

问题:

我从 SQL 获取结果,将其存储在数据适配器上并循环 CreateButtons 函数为返回的每一行创建单独的按钮。我能够获得创建按钮所需的结果,但是当我尝试为按钮设置操作时出现问题。

我需要为所有动态创建的按钮设置 onclick 事件处理程序,以便我能够为它们提供单独的操作。

当我使用 new System.EventHandler 语句单击当前代码时,页面刷新但没有任何反应,即使我有以下模块。

public void test(object sender, EventArgs e)
{
     Response.Write("Dynamic Button click event");
}

研究成果: 我一直在寻找解决方案很长一段时间,我能够找到在页面加载中创建按钮的工作代码,但没有找到在按钮单击事件上创建动态按钮的类似案例。

需要在 Page_Init 中重新创建动态控件。

尝试下面的示例进行测试

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

事情是这样的。

  1. 有人点击 Button1。这会导致 PostBack
  2. ASP.Net 收到 POST 请求,为您的页面 class 创建一个 新实例 (这是关键),然后开始重新-运行 整个 页面生命周期。
  3. Button1_Click() 代码 运行 作为页面生命周期的一部分并将新按钮放入页面 class
  4. 页面 class 将 HTML 呈现给响应,浏览器会在响应中接收响应并将其呈现到屏幕上供您的用户使用。此时,您一直在服务器上使用的 Page class 实例(具有所有新按钮的实例)已 destroyed。不过,按钮已呈现给浏览器。
  5. 一位用户点击了您的一个新按钮。 这会导致新的 PostBack。
  6. ASP.Net 收到 POST 请求并创建页面 class.
  7. 新实例

这就是事情变得混乱的地方。 Page class 的新实例没有任何动态按钮。

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

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