我在向ImageButton添加事件时遇到问题。我必须根据DropDownList中的选定选项创建一组按钮。使用数据库数据成功创建按钮,但我无法附加OnClick功能。
创建的按钮必须共享同一个Handler。
protected void cmbServ_SelectedIndexChanged(object sender, EventArgs e) {
ServiceID = cmbServ.SelectedValue.ToString();
ServiceName = cmbServ.SelectedItem.ToString();
DataTable dtFirstTab = new DataTable();
dtFirstTab = mySQLConn.getTable(qryCarry); // LOAD DATA FROM DB
foreach (DataRow row in dtFirstTab.Rows) {
FTabBtn = "btn"+(Convert.ToInt32(row["SKU_Credito"])).ToString();
FTabIconURL = row["SKU_Icon"].ToString();
Panel dvFirstTab = new Panel();
dvFirstTab.CssClass = "col-xs-2";
ImageButton IB = new ImageButton();
IB.ID = FTabBtn;
IB.ImageUrl = FTabIconURL;
IB.Click += new ImageClickEventHandler(btnX_click); // <-- PROBLEM
dvFirstTab.Controls.Add(IB);
pnlIcons.Controls.Add(dvFirstTab); // pnlIcons exists in HTML
}
protected void btnX_click(object sender, ImageClickEventArgs e) {
string Obj = ((ImageButton)sender).ClientID;
Cantidad = Convert.ToInt32(Obj.Substring(3, (Obj.Length) - 3));
txtMonto.Text = "$" + Cantidad.ToString();
}
所有按钮都正确显示,但是当我点击它们时,它们只会触发“提交”操作,就像没有分配OnClick一样。
没有CodeBehid示例:
如果我在HTML中添加这一行(我删除了asp标签)
ImageButton ID="btn10" runat="server" ImageUrl="MontoLogo_10ST.png" OnClick="btnX_click"
它确实按预期工作。
有什么想法吗?非常感谢!
答案 0 :(得分:0)
在ASP.NET webforms中动态创建控件通常在开始时很容易,但在处理事件时问题非常普遍。即使您正确分配了事件处理程序,在页面生命周期的早期重新创建所有动态控件之前,事件处理程序也不会在回发中运行。这解释了为什么ASPX上带有ImageButton的样本有效,而动态创建的按钮不适用。
有关动态创建控件的详细信息,请参阅此page。最重要的部分是警告基本上说:如果你需要添加动态控件,最好不要。
通常,您可以找到一种在标记中创建所有必要控件的方法,例如使用Repeater控件。转发器的最大优点是您可以控制所创建的标记。
以下示例概述了必要的步骤:
答案 1 :(得分:0)
好的,我找到了原因。必须在Page_Load事件中分配事件处理,因此我将所有内容移动到方法中并从Page_Load调用它,从“SelectedIndexChanged”调用它不起作用。它现在正在运作。
谢谢!