事件绑定到 Repeater 的每个 LinkButton 不起作用
Event binding to each LinkButton of Repeater not working
我需要在 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 设置正确,不要介意)
我解决了。
参考:https://forums.asp.net/t/1680429.aspx?bind+event+handler+for+dynamic+controls+in+repeater
As far as I know, "itemDataBound" event is used when you call DataBind(). However, a databind process can usually be done in the body of if (!IsPostBack){……},So you can never call DataBind() any more, I guess the reason is this.
To solve the problem, You can try to put the codes like this:
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 了解不足造成的。很抱歉在 post 问题后的几分钟内自行回答。
我需要在 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 设置正确,不要介意)
我解决了。
参考:https://forums.asp.net/t/1680429.aspx?bind+event+handler+for+dynamic+controls+in+repeater
As far as I know, "itemDataBound" event is used when you call DataBind(). However, a databind process can usually be done in the body of if (!IsPostBack){……},So you can never call DataBind() any more, I guess the reason is this.
To solve the problem, You can try to put the codes like this:
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 了解不足造成的。很抱歉在 post 问题后的几分钟内自行回答。