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");
}
事情是这样的。
- 有人点击 Button1。这会导致 PostBack
- ASP.Net 收到 POST 请求,为您的页面 class 创建一个 新实例 (这是关键),然后开始重新-运行 整个 页面生命周期。
Button1_Click()
代码 运行 作为页面生命周期的一部分并将新按钮放入页面 class
- 页面 class 将 HTML 呈现给响应,浏览器会在响应中接收响应并将其呈现到屏幕上供您的用户使用。此时,您一直在服务器上使用的 Page class 实例(具有所有新按钮的实例)已 destroyed。不过,按钮已呈现给浏览器。
- 一位用户点击了您的一个新按钮。 这会导致新的 PostBack。
- ASP.Net 收到 POST 请求并创建页面 class.
的 新实例
这就是事情变得混乱的地方。 Page class 的新实例没有任何动态按钮。
您需要代码将这些按钮重新添加到每个 PostBack 的 class 中。此外,ASP.Net 页面生命周期的 事件处理程序是在 Page_Load 事件之前确定的。 因此,如果您等到 Page_Load 设置动态按钮,事情将无法正常工作。您会在屏幕上看到它们。您可以单击它们并强制执行 PostBack(因为事件处理程序将在那里用于稍后的渲染步骤)。但是点击按钮什么也不会发生。
要解决此问题,需要在 Page_Init 或 Page_PreInit 中(重新)创建按钮。
我有几个下拉列表,根据用户的选择,我必须在 [动态创建] 的各个按钮中显示从 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");
}
事情是这样的。
- 有人点击 Button1。这会导致 PostBack
- ASP.Net 收到 POST 请求,为您的页面 class 创建一个 新实例 (这是关键),然后开始重新-运行 整个 页面生命周期。
Button1_Click()
代码 运行 作为页面生命周期的一部分并将新按钮放入页面 class- 页面 class 将 HTML 呈现给响应,浏览器会在响应中接收响应并将其呈现到屏幕上供您的用户使用。此时,您一直在服务器上使用的 Page class 实例(具有所有新按钮的实例)已 destroyed。不过,按钮已呈现给浏览器。
- 一位用户点击了您的一个新按钮。 这会导致新的 PostBack。
- ASP.Net 收到 POST 请求并创建页面 class. 的 新实例
这就是事情变得混乱的地方。 Page class 的新实例没有任何动态按钮。
您需要代码将这些按钮重新添加到每个 PostBack 的 class 中。此外,ASP.Net 页面生命周期的 事件处理程序是在 Page_Load 事件之前确定的。 因此,如果您等到 Page_Load 设置动态按钮,事情将无法正常工作。您会在屏幕上看到它们。您可以单击它们并强制执行 PostBack(因为事件处理程序将在那里用于稍后的渲染步骤)。但是点击按钮什么也不会发生。
要解决此问题,需要在 Page_Init 或 Page_PreInit 中(重新)创建按钮。