2016-12-03 99 views
0

我有添加事件到ImageButton的问题。我必须根据DropDownList中的选定选项创建一组按钮。使用数据库数据成功创建按钮,但我无法附加OnClick功能。ASP.NET C#问题添加事件处理程序的ImageButton代码隐藏

创建的按钮必须共享同一个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

只是说IB.Click + = btnX_click。 btnx_click已经是一个事件处理程序,不需要创建另一个。 – cyanide

回答

0

在ASP.NET webforms中动态创建控件通常在开始时看起来很简单,但在处理事件时问题非常普遍。即使正确分配了事件处理程序,也不会在回发中运行事件处理程序,除非在页面生命周期的早期重新创建所有动态控件。这解释了为什么在ASPX上使用ImageButton的示例可以正常工作,而动态创建的按钮则不适用。

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

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

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

  1. 将您的aspx页面上的转发器。如果pnlIcons除了作为动态创建的按钮的容器之外没有其他目的,则用中继器代替它。使用Header-和FooterTemplate属性添加围绕ImageButton的标记(例如dvFirstTab的div)。
  2. 想想你需要分配到图像按钮的数据。在你的情况下,“SKU_Credito”和“SKU_Icon”字段似乎是必需的。
  3. 将图像按钮放置在中继器的ItemTemplate中,并将属性“Id”和“ImageUrl”绑定到相应的字段。
  4. 添加命令事件处理程序和CommandArgument属性绑定到一个值,可以帮助你的图像按钮之间辨别。
  5. 在指令事件处理程序,您可以使用CommandArgument发现已被点击了哪个按钮。添加处理该命令的适当代码。
  6. 在SelectedIndexChanged事件处理程序中,从数据库中读取的数据,并转发器结合的结果。这将使用ImageButton创建中继器中的行。
0

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

谢谢!

相关问题