ASP.NET ListView控件未触发OnItemCommand事件

时间:2011-09-20 19:31:35

标签: c# asp.net listview event-handling repeater

我知道这听起来像其他一些帖子,所有这些都是我读过的,但没有解决我的问题。

这是场景......

我有一个Repeater和一个绑定到同一数据源的ListView。每个控件都包含一个ASP:LinkBut​​ton,单击它时,应触发OnItemCommand事件。虽然它们连接到页面生命周期中完全相同位置的EXACT相同数据,并且页面和每个单独控件都启用了View状态,但Repeater似乎触发了事件而ListView却没有。

我知道如果在分配事件处理程序之前数据未绑定,则不会触发事件。当页面被发回时,我依赖ViewState来重新填充控件。在逐步执行请求的同时查看调试模式中的每个控件,我可以看到Repeater DOES确实似乎重新填充了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有机会重新构建自身之后,控件在Pre-Render阶段绑定到数据源的位置。

    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 Handler触发并正确执行,但进程甚至没有进入ListView处理程序的处理程序。

我对这个问题感到很困惑。我希望有人可能会对此有所了解。我至少可以尝试一下吗?

谢谢, 加里

1 个答案:

答案 0 :(得分:0)

您应该在ListView中设置每个LinkBut​​ton的CommandName属性,最后还要设置CommandArgument

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

在发布新问题之前,还要在SO中查询问题; - )

listview OnItemCommand dosen't fire up