Кнопка в репитере не запускает ItemCommand - PullRequest
3 голосов
/ 26 марта 2010

Почему кнопка внутри ретранслятора не запускает событие 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);
  }

Ответы [ 3 ]

15 голосов
/ 26 марта 2010

Редактировать : по вашим другим комментариям звучит так, будто вы повторно привязываете ретранслятор при каждой обратной передаче. Когда вы делаете это, вы уничтожаете источник события 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 явно выполняется, когда я нажимаю «Одобрить» или «Удалить», он просто не затрагивает ни один из случаев, потому что для этих кнопок не определены имена команд.

9 голосов
/ 26 марта 2010

Когда вы привязываете свой ретранслятор? Если вы делаете это вручную, убедитесь, что вы привязываете его, только если страница не является обратной передачей.

Укажите больше кода, пожалуйста

1 голос
/ 01 декабря 2011

Как другие 2 поста описывают

  • Не перепривязывать на PostBack
  • Убедитесь, что вы установили свойство CommandName для кнопки

И еще одна проблема, с которой я столкнулся: свойство EnableViewState для Repeater установлено на false, для него необходимо установить значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...