繁体   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