Я знаю, что это звучит как ряд других постов, все из которых я прочитал, но не затронул мою проблему.
Вот сценарий ...
У меня ОБА есть повторитель и 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.
Я безумно запутался в этом вопросе. Я надеюсь, что у кого-то могут быть какие-то мысли по этому поводу. Что-то я могу попробовать хотя бы?
Спасибо,
Гари