【问题标题】:C# ASP - Dynamic button creation and assigning event handlersC# ASP - 动态按钮创建和分配事件处理程序
【发布时间】:2018-05-04 11:59:59
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net webforms eventhandler


    【解决方案1】:

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

    试试下面的例子进行测试

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

    【讨论】:

      【解决方案2】:

      这就是发生的事情。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 2017-07-29
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2014-03-12
        • 2018-12-20
        相关资源
        最近更新 更多