3

Repeater 内のボタンが Repeater の ItemCommand イベントを発生させないのはなぜですか? 強制的にそうさせる方法はありますか?ViewState は有効です。

以下のコードでは、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);
  }
4

3 に答える 3

15

編集:他のコメントによると、すべてのポストバックでリピーターを再バインドしているようです。ItemCommandこれを行うと、のイベントソース(クライアントがクリックしたボタンに関連付けられた元のRepeaterアイテム)が破棄されます。

ユーザーはドロップダウンから「承認済み」または「削除済み」を選択し、検索(ポストバック)をクリックすると、BindList()がデータソースを新しい結果にバインドします。

ドロップダウンのハンドラーでリピーターを再バインドできます。「承認」または「削除」ボタンによって開始された実行パス中にリピーターを再バインドしていないことを確認してください。


別の問題があるかもしれませんが、そのコードを機能させるには、ボタンのコマンド名を必ず指定する必要があります。

<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[承認]または[削除]をクリックすると、メソッドが明確に実行されます。これらのボタンにはコマンド名が定義されていないため、どのケースにも当てはまりません。

于 2010-03-26T15:33:42.790 に答える
9

リピーターはいつバインドしますか?手動で行う場合は、ページがポストバックでない場合にのみバインドするようにしてください。

もう少しコードを提供してください

于 2010-03-26T15:14:15.040 に答える
1

他の2つの投稿が説明しているように

  • PostBack で再バインドしない
  • ボタンに CommandName プロパティを設定していることを確認してください

そして、私が抱えていた別の問題は、リピーターの EnableViewState プロパティを false に設定することでした。true に設定する必要があります。

于 2011-12-01T11:05:23.557 に答える