簡體   English   中英

ASP.NET ListView控件未觸發OnItemCommand事件

[英]ASP.NET ListView control not firing OnItemCommand Event

我知道這聽起來像是其他許多帖子,盡管我已經閱讀了所有這些帖子,但並未解決我的問題。

這是場景...

我有一個Repeater和一個ListView綁定到相同的數據源。 每個控件都包含一個ASP:LinkBut​​ton,單擊該控件應會觸發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);

    }

說到底,當我單擊每個控件中的LinkBut​​ton時,Repeater的ItemCommand處理程序將觸發並正確執行,但該過程甚至沒有輸入ListView處理程序的處理程序。

我對這個問題感到困惑。 我希望有人對此有一些想法。 我至少可以嘗試一下?

謝謝,加里

您應該在ListView中設置每個LinkBut​​ton的CommandName屬性,最終還要設置CommandArgument

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

在發布新問題之前,也請在SO中檢查此處的問題;-)

listview OnItemCommand沒有啟動

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM