我需要为C#(asp.net)中的每个中继器设置一个按钮。
<com:Repeater runat="server" ID="list_repeater">
<ItemTemplate>
<tr>
<td>
<asp:LinkButton runat="server" ID="btnCancel" CommandArgument='<%# Eval("id") %>'>Cancel</asp:LinkButton>
</td>
...
</tr>
</ItemTemplate>
</com:Repeater>
我将数据绑定到PageLoad中。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
list_repeater.DataSource = ... getData ..;
list_repeater.DataBind();
...
}
}
当然,我在列表上绑定了RepeaterItemEventHandler。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
base.LoadingControlAdd();
...
list_repeater.ItemDataBound += new RepeaterItemEventHandler(list_repeater_ItemDataBound);
...
}
然后将EventHandler绑定到每个btnCancel。
protected void list_repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
LinkButton btnCancel = e.Item.FindControl("btnCancel") as LinkButton;
btnCancel.Click += new EventHandler(btnCancel_Click);
}
}
但是,它不起作用。 当我单击每个项目的btnCancel时,不会触发 btnCancel_Click 。我认为我做得很好,并且找不到任何缺陷。上面的代码是否有任何错误,请告诉我有什么问题。谢谢。 (CommnadArgument上的ID设置正确,请不要介意)
答案 0 :(得分:0)
我已解决。
引用:https://forums.asp.net/t/1680429.aspx?bind+event+handler+for+dynamic+controls+in+repeater
据我所知,调用DataBind()时会使用“ itemDataBound”事件。但是,数据绑定过程通常可以在if(!IsPostBack){……}的主体中完成,因此您再也不能调用DataBind()了,我想原因是这样的。
要解决此问题,您可以尝试添加如下代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
list_repeater.DataSource = ... getData ..;
list_repeater.DataBind();
...
}
...
foreach(RepeaterItem item in list_repeater.Items) {
if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
LinkButton btnCancel = item.FindControl("btnCancel") as LinkButton;
btnCancel.Click += new EventHandler(btnCancel_Click);
}
}
这是由于我对asp.net的了解不足所致。抱歉,问题发表后几分钟内就会自动回答。