[英]ASP.NET ListView control not firing OnItemCommand Event
我知道這聽起來像是其他許多帖子,盡管我已經閱讀了所有這些帖子,但並未解決我的問題。
這是場景...
我有一個Repeater和一個ListView綁定到相同的數據源。 每個控件都包含一個ASP:LinkButton,單擊該控件應會觸發OnItemCommand事件。 盡管它們在頁面生命周期中相同位置的相同位置連接了相同數據,並且為頁面啟用了視圖狀態,並且每個單獨的控件都顯示了Repeater觸發事件,而ListView卻沒有。
我知道,如果在分配事件處理程序之前未綁定數據,則事件不會觸發。 我依靠ViewState重新將控件發布到頁面時。 在調試請求中查看調試模式下的每個控件,我可以看到Repeater確實確實填充了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>
在ViewState有機會重新構造自身之后,在Pre-Render階段中, OrderControl.ASCX.CS是將控件綁定到數據源的位置。
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時,Repeater的ItemCommand處理程序將觸發並正確執行,但該過程甚至沒有輸入ListView處理程序的處理程序。
我對這個問題感到困惑。 我希望有人對此有一些想法。 我至少可以嘗試一下?
謝謝,加里
您應該在ListView中設置每個LinkButton的CommandName
屬性,最終還要設置CommandArgument
。
<td align="center">
<asp:LinkButton runat="server" id="lnkOrderId1" CommandName="yourCommandName" CommandArgument="yourCommandArgument" />
</td>
在發布新問題之前,也請在SO中檢查此處的問題;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.