我有几个下拉列表,根据用户选择,我必须在[动态创建]的各个按钮中显示从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");
}
研究工作: 我一直在查找解决方案已经有一段时间了,我能够在页面加载中找到创建按钮的工作代码,但是没有找到类似于在按钮点击事件中创建动态按钮的情况。
答案 0 :(得分:1)
需要在Page_Init
中重新创建动态控件。
尝试以下示例进行测试
protected void Page_Init(object sender, EventArgs e)
{
CreateButtons("1");
CreateButtons("2");
}
答案 1 :(得分:0)
这是发生的事情。
Button1_Click()
代码作为页面生命周期的一部分运行,并将新按钮放入Page类这是事情变得混乱的地方。 Page类的新实例没有任何动态按钮。
您需要使用代码将这些按钮重新添加到每个PostBack的类中。此外,ASP.Net页面生命周期的事件处理程序在Page_Load事件之前确定。因此,如果您等到Page_Load设置动态按钮,事情将无法正常工作。你会在屏幕上看到它们。您可以单击它们并强制使用PostBack(因为事件处理程序将在稍后的Render步骤中出现)。但是点击按钮就不会发生任何事情。
要解决此问题,需要在Page_Init或Page_PreInit中重新创建按钮。