为什么中继器内的按钮不会触发中继器的 ItemCommand 事件?有没有办法强制它这样做? View 状态已启用。
在下面的代码中,btnApprove 和 btnDelete 是有问题的按钮:
<asp:Repeater runat="server" ID="rpt1" onitemdatabound="rpt1_ItemDataBound" onitemcommand="rpt1_ItemCommand" >
<ItemTemplate>
<table width="100%" style="margin-bottom:6px;">
<tr>
<td>
<asp:CheckBox ID="chkSelected" runat="server" Text=" " TextAlign="Right"/> Select
<asp:Button ID="btnApprove" runat="server" Width="80px" Text="Approve" />
<asp:Button ID="btnDelete" runat="server" Width="80px" Text="Delete" />
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="lblCommentStatus" runat="server" Text="Label"></asp:Label>
</td>
</tr>
</table>
<table width="100%" style="margin-top:6px;">
<tr>
<td><asp:Label ID="lblAuthorName" runat="server" Text="Author: " Width="60px"></asp:Label></td>
<td><asp:TextBox ID="txtAuthorName" runat="server" Width="250px"></asp:TextBox></td>
<td style="padding-left: 30px;"><asp:Label ID="lblAuthorLocation" runat="server" Text="Location: " Width="70px"></asp:Label></td>
<td><asp:TextBox ID="txtAuthorLocation" runat="server" Width="250px"></asp:TextBox></td>
</tr>
</table>
Title: <asp:TextBox ID="txtTitle" runat="server" Width="640px" Enabled="False"></asp:TextBox>
Body: <asp:TextBox ID="txtBody" runat="server" Width="640px" TextMode="MultiLine" Height="60px" Enabled="False"></asp:TextBox>
<table width="100%" style="margin-top:6px;">
<tr>
<td><asp:Label ID="lblVotes" runat="server" Text="Votes: " Width="80px"></asp:Label></td>
<td><asp:Label ID="lblVotesCount" runat="server" Text="" Width="600px"></asp:Label></td>
</tr>
</table>
<hr style="margin-top:20px; margin-bottom:20px;" />
</ItemTemplate>
</asp:Repeater>
/// <summary>
/// Handles the ItemCommand event of the rpt1 control.
/// </summary>
/// <param name="source">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.RepeaterCommandEventArgs"/> instance containing the event data.</param>
protected void rpt1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
var c1 = CommentRepository.GetById(Convert.ToUInt64(e.CommandArgument.ToString()));
if (e.CommandName == "approve")
{
c1.Approved = true;
c1.ApprovationUserId = WebAdminContext.RelatedUserId;
}
if (e.CommandName == "reject")
{
c1.Approved = false;
c1.ApprovationUserId = 0;
}
if (e.CommandName == "delete")
{
c1.Deleted = true;
c1.DeletionUserId = WebAdminContext.RelatedUserId;
}
if (e.CommandName == "restore")
{
c1.Deleted = false;
c1.DeletionUserId = 0;
}
CommentRepository.Update(c1);
ResetSubSequenceInfo();
BindList();
}
/// <summary>
/// Binds the list.
/// </summary>
private void BindList()
{
_Criteria = lcb1.GenerateCriteriaFromUI();
var sc1 = CommentRepository.Filter(
new FilteringOptions(
EntityListPager1.CurrentSubSequenceInfo,
null,
CommentRepository.GetCriteriaToFilterByTGID(CurrentEntityGEODEReference.GID).And(_Criteria)
)
);
// BIND
rpt1.DataSource = sc1.Items;
rpt1.DataBind();
EntityListPager1.BindToUI(sc1.Info);
}
最佳答案
编辑 :根据您的其他评论,听起来您在每次回发时都重新绑定(bind)了转发器。当您这样做时,您会破坏 ItemCommand
的事件源 - 与客户端单击的按钮相关联的原始 Repeater 项目。
您可以在下拉处理程序中重新绑定(bind)转发器,只需确保您没有在“批准”或“删除”按钮启动的执行路径期间执行此操作。
可能还有另一个问题,但您肯定需要为按钮指定命令名称才能使该代码正常工作:
<asp:Button ID="btnApprove" runat="server" Width="80px" Text="Approve" CommandName="approve"/>
<asp:Button ID="btnDelete" runat="server" Width="80px" Text="Delete" CommandName="delete"/>
我无法重现该问题:您确定
ItemCommand
处理程序甚至没有触发吗?使用稍微修改过的代码版本,当我单击“批准”或“删除”时,我的 rpt1_ItemCommand
方法显然正在执行,它只是没有遇到任何情况,因为这些按钮没有定义命令名称。关于c# - 中继器中的按钮不会触发 ItemCommand,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2524270/