2011-09-20 90 views
2

我知道這聽起來像其他一些帖子,所有我已閱讀但沒有解決我的問題。ASP.NET ListView控件沒有觸發OnItemCommand事件

這裏的情景......

我都一直放站和綁定到同一數據源的一個ListView。每個控件都包含一個ASP:LinkBut​​ton,點擊後應該觸發OnItemCommand事件。雖然他們連接到EXACT相同的數據在EXACT相同的頁面生命週期的相同位置和查看狀態啓用的頁面和每個單獨的控制Repeater似乎觸發事件和ListView不。

我知道如果數據未被綁定到事件處理程序的賦值之前,事件將不會觸發。我依靠ViewState在頁面重新發布時重新填充控件。在調試模式下查看每個控件時,通過一個請求,我可以看到Repeater確實看起來重新填充了ViewState數據,但ListView沒有。

由於這些都是生成,填充,綁定和處理差不多相同,我完全喪失了爲什麼會發生這種情況。我也注意到與GridView控件類似的問題(它不會觸發事件)。我假設這些都是相關的。

,我能想到的,在GridView和ListView的共同點是,直放站不唯一的是內置分頁功能。無論是否實現,是否存在與分頁有關的事情,影響ViewState的加載?

OrderControl.ASCX是主機頁/應用程序,它暴露了ListView和中繼器作爲屬性對照(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); 

    } 

畢竟是說,當我在旺火上LinkBut​​ton的點擊控制ItemCommand處理程序的中繼火災和正確執行,但過程中甚至沒有進入爲ListView處理程序處理程序中完成。

我對這個問題很困惑。我希望有人可能對此有一些想法。我至少可以嘗試一些東西?

感謝, 加里

回答

0

你應該設置在ListView每個LinkBut​​ton的的CommandName財產,最終也CommandArgument

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

還發布了一個新問題;-)

listview OnItemCommand dosen't fire up

+0

我發佈前一定研究,並花了一些時間看你的引用前後點擊此處查看常見問題的SO。命令參數在OnItemDataBound處理程序中設置(它似乎省略了ListView上的OnItemDataBound處理程序,同時修剪了該帖子的代碼,我將修復此問題)。此外CommandName沒有爲Repeater設置,它的工作原理......我最初的CommandName設置爲無效。 –

+0

值得注意的是,從建議的帖子中添加命令名稱屬性的解決方案非常有用,因此您可以在事件處理程序中確定WHICH命令按鈕被按下。但是,我遇到的問題是該進程從不進入事件處理程序,因此我從來沒有機會評估命令名稱。這也不能解釋爲什麼幾乎是IDENTICALLY實現的Repeater工作,而ListView和GridView則不工作。 –