ASP.NET C#问题向ImageButton CodeBehind添加事件处理程序

时间:2016-12-03 05:36:34

标签: c# asp.net imagebutton eventhandler selectedindexchanged

我在向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"

它确实按预期工作。

有什么想法吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

在ASP.NET webforms中动态创建控件通常在开始时很容易,但在处理事件时问题非常普遍。即使您正确分配了事件处理程序,在页面生命周期的早期重新创建所有动态控件之前,事件处理程序也不会在回发中运行。这解释了为什么ASPX上带有ImageButton的样本有效,而动态创建的按钮不适用。

有关动态创建控件的详细信息,请参阅此page。最重要的部分是警告基本上说:如果你需要添加动态控件,最好不要。

通常,您可以找到一种在标记中创建所有必要控件的方法,例如使用Repeater控件。转发器的最大优点是您可以控制所创建的标记。

以下示例概述了必要的步骤:

  1. 在您的aspx页面上放置一个转发器。如果pnlIcons不是用于动态创建按钮的容器的其他目的,则由转发器替换它。使用Header-和FooterTemplate属性添加围绕ImageButtons的标记(例如dvFirstTab的div)。
  2. 考虑您需要将哪些数据分配给图像按钮。在您的情况下,字段&#34; SKU_Credito&#34;和&#34; SKU_Icon&#34;似乎是必需的。
  3. 将图像按钮放在转发器的ItemTemplate中并绑定属性&#34; Id&#34;和#34; ImageUrl&#34;到相应的领域。
  4. 添加一个Command事件处理程序,并将CommandArgument属性绑定到一个值,以帮助您识别图像按钮。
  5. 在命令事件处理程序中,您可以使用CommandArgument来发现单击了哪个按钮。添加处理命令的相应代码。
  6. 在SelectedIndexChanged事件处理程序中,从数据库中读取数据并将转发器绑定到结果。这将使用ImageButtons在转发器中创建行。

答案 1 :(得分:0)

好的,我找到了原因。必须在Page_Load事件中分配事件处理,因此我将所有内容移动到方法中并从Page_Load调用它,从“SelectedIndexChanged”调用它不起作用。它现在正在运作。

谢谢!