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

时间:2018-05-04 11:59:59

标签: c# asp.net webforms eventhandler

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

CODE:

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]);
}

ISSUE:

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

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

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

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

研究工作: 我一直在查找解决方案已经有一段时间了,我能够在页面加载中找到创建按钮的工作代码,但是没有找到类似于在按钮点击事件中创建动态按钮的情况。

2 个答案:

答案 0 :(得分:1)

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

尝试以下示例进行测试

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

答案 1 :(得分:0)

这是发生的事情。

  1. 有人点击了Button1。这会导致PostBack
  2. ASP.Net接收POST请求,创建Page类的新实例(该键),并开始重新运行整个页面生命周期。
  3. Button1_Click()代码作为页面生命周期的一部分运行,并将新按钮放入Page类
  4. Page类将HTML呈现给Response,浏览器在其中接收它并将其呈现给用户的屏幕。此时,您在服务器上使用的Page类实例 - 包含所有新按钮的实例 - 已被销毁。但是,按钮被渲染到浏览器中。
  5. 用户点击其中一个新按钮。 这会导致新的PostBack。
  6. ASP.Net接收POST请求并创建Page类的新实例
  7. 这是事情变得混乱的地方。 Page类的新实例没有任何动态按钮。

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

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