简体   繁体   English

Repeater中的按钮不会触发ItemCommand

[英]Button in a Repeater does not fire ItemCommand

Why would a button inside a Repeater not fire the Repeater's ItemCommand event? 为什么Repeater中的按钮不会触发Repeater的ItemCommand事件? Is there a way to force it to do so? 有没有办法强迫它这样做? ViewState is Enabled. ViewState已启用。

In the code below, btnApprove and btnDelete are the buttons in question: 在下面的代码中,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);
  }

Edit : per your other comments, it sounds like you're re-binding the repeater on every postback. 编辑 :根据您的其他评论,听起来您在每次回发时重新绑定转发器。 When you do that, you destroy the ItemCommand 's event source - the original Repeater item associated with the button the client clicked. 当您这样做时,您将销毁ItemCommand的事件源 - 与客户端单击的按钮关联的原始Repeater项。

The user selects "approved" or "deleted" from a dropdown, clicks search (a postback) and BindList() binds the datasource the to new results. 用户从下拉列表中选择“已批准”或“已删除”,单击搜索(回发),BindList()将数据源绑定到新结果。

You can re-bind the repeater in your drop-down's handler, just make sure you aren't doing it during the execution path initiated by your 'Approve' or 'Delete' buttons. 您可以在下拉列表处理程序中重新绑定转发器,只需确保在“批准”或“删除”按钮启动的执行路径中不执行此操作。


There may be another issue, but you definitely need to specify command names for your buttons for that code to work: 可能还有另一个问题,但您肯定需要为按钮指定命令名称才能使该代码起作用:

<asp:Button ID="btnApprove" runat="server" Width="80px" Text="Approve" CommandName="approve"/>
<asp:Button ID="btnDelete" runat="server" Width="80px" Text="Delete" CommandName="delete"/>

I can't reproduce the problem: are you sure the ItemCommand handler isn't even firing? 我无法重现这个问题:你确定ItemCommand处理程序甚至没有触发吗? Using a slightly modified version of your code, my rpt1_ItemCommand method is clearly executing when I click 'Approve' or 'Delete', it just isn't hitting any of the cases, because those buttons don't have command names defined. 使用稍微修改过的代码版本,当我单击“批准”或“删除”时,我的rpt1_ItemCommand方法显然正在执行,它只是没有遇到任何情况,因为这些按钮没有定义命令名。

When do you bind your repeater? 你什么时候绑定你的中继器? If you do it manually, be sure that you only bind it, if the page is not a postback. 如果您手动执行此操作,请确保仅绑定它,如果页面不是回发。

Provide some more code please 请提供更多代码

As the other 2 posts describe 正如其他2个帖子所述

  • Do not rebind on PostBack 不要在PostBack上重新绑定
  • Make sure you set the CommandName property on the Button 确保在Button上设置CommandName属性

And another problem i had, was having EnableViewState property on the Repeater set to false, it needs to be set to true. 我遇到的另一个问题是,将Repeater上的EnableViewState属性设置为false,需要将其设置为true。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM