Элемент управления ASP.NET ListView не запускает событие OnItemCommand - PullRequest
2 голосов
/ 20 сентября 2011

Я знаю, что это звучит как ряд других постов, все из которых я прочитал, но не затронул мою проблему.

Вот сценарий ...

У меня ОБА есть повторитель и ListView, привязанный к одному источнику данных. Каждый элемент управления содержит ASP: LinkButton, который при щелчке должен запускать событие OnItemCommand. Хотя они подключены к ТОЧНЫМ одинаковым данным в ТОЧНЫХ одинаковых местах в жизненном цикле страницы, и Состояние просмотра включено для страницы, и для каждого отдельного элемента управления повторитель появляется для запуска события, а ListView - нет.

Я знаю, что событие не сработает, если данные не связаны ДО назначения обработчика события. Я полагаюсь на ViewState для повторного заполнения элементов управления, когда страница отправляется обратно. Глядя на каждый элемент управления в режиме отладки во время пошагового выполнения запроса, я вижу, что повторитель действительно кажется переполненным данными ViewState, а ListView - нет.

Поскольку они оба генерируются, заполняются, связываются и обрабатываются почти ИДЕНТИЧНО, я совершенно не понимаю, почему это может происходить. Я также заметил похожую проблему с элементом управления GridView (он не запускает событие). Я предполагаю, что это как-то связано.

Единственное, что я могу думать о том, что у GridView и ListView общего, чего нет у Repeater, - это встроенная возможность подкачки страниц. Реализовано или нет, есть ли что-то с подкачкой, которая влияет на загрузку ViewState?

OrderControl.ASCX - это элемент управления, который предоставляет ListView и Repeater в качестве свойств (OrderListLV & OrderListRPT) для главной страницы / приложения.

    <asp:ListView runat="server" id="lvOrderList" OnItemDataBound="lstOrderList_OnItemDataBound" EnableViewState="true" >
    <LayoutTemplate>
        <table class="tblGrid">
        <tr runat="server" id="itemPlaceholder" />
        </table>
        <ASP:DataPager runat="server" ID="dataPager1" PageSize="3">
        <Fields>
            <ASP:NextPreviousPagerField 
                 ButtonType="Button" 
                 ShowFirstPageButton="true"
                 ShowLastPageButton="true"
                 ShowNextPageButton="true"
                 ShowPreviousPageButton="true" />
        </Fields>
        </ASP:DataPager>
    </LayoutTemplate>
    <ItemTemplate>
        <tr class="row-">
            <td align="center"><ASP:LinkButton runat="server" id="lnkOrderId1" /></td>
        </tr>
    </ItemTemplate>
    </asp:ListView> 


    <asp:Repeater runat="server" id="rptOrderList" OnItemDataBound="rptOrderList_ItemDataBound">
    <HeaderTemplate>
        <table class="tblGrid"> 
    </HeaderTemplate>
    <ItemTemplate>
        <tr">
            <td align="center"><ASP:LinkButton runat="server" id="lnkOrderId" /></td>
        </tr>
    </ItemTemplate>

    <FooterTemplate>
        </table>
    </FooterTemplate>
    </asp:Repeater>

OrderControl.ASCX.CS - это место, где элементы управления привязаны к источнику данных на этапе предварительной визуализации, задолго до того, как ViewState сможет восстановить себя.

    protected override void OnPreRender(EventArgs e)
    {
        this.lstOrderList.DataSource = this.OrderHeaders.OrderByDescending(x => x.OrderDate).ToList();
        this.lstOrderList.DataBind();

        this.rptOrderList.DataSource = this.OrderHeaders.OrderByDescending(x => x.OrderDate).ToList();
        this.rptOrderList.DataBind();
    }

Host.ASPX.CS - это страница, которая использует элемент управления. Он прикрепляет обработчики событий непосредственно к элементам управления в своем обработчике OnLoad.

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        this.OrderControl.OrderListRPT.ItemCommand    += new RepeaterCommandEventHandler(OrderList2_ItemCommand);
        this.OrderControl.OrderListLV.ItemCommand     += new EventHandler<ListViewCommandEventArgs>(OrderList_ItemCommand);

    }

После того, как все сказано и сделано, когда я нажимаю на LinkButton в каждом элементе управления, обработчик ItemCommand для Repeater запускается и выполняется правильно, но процесс даже не вводит обработчик для обработчика ListView.

Я безумно запутался в этом вопросе. Я надеюсь, что у кого-то могут быть какие-то мысли по этому поводу. Что-то я могу попробовать хотя бы?

Спасибо, Гари

1 Ответ

0 голосов
/ 20 сентября 2011

Вы должны установить свойство CommandName каждого LinkButton в ListView, в конечном итоге также CommandArgument.

<td align="center">
  <asp:LinkButton runat="server" id="lnkOrderId1" CommandName="yourCommandName" CommandArgument="yourCommandArgument" />
</td>

также проверьте заданные вопросы здесь в SO, прежде чем отправлять новый вопрос; -)

listView OnItemCommand не запускается

...