【问题标题】:ASP.NET ListView control not firing OnItemCommand EventASP.NET ListView 控件未触发 OnItemCommand 事件
【发布时间】:2011-09-20 19:31:34
【问题描述】:

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

这里的场景......

我有一个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>

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

我对这个问题非常困惑。我希望有人可能对此有一些想法。至少我可以尝试一下?

谢谢, 加里

【问题讨论】:

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


    【解决方案1】:

    您应该在 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

    【讨论】:

    • 我在发布之前确实进行了研究,并花了一些时间查看您引用的帖子。命令参数是在 OnItemDataBound 处理程序中设置的(看来我省略了 ListView 上的 OnItemDataBound 处理程序,同时修剪了这篇文章的代码。我会解决这个问题)。此外,没有为中继器设置 CommandName,它确实可以工作......我最初也将 CommandName 设置为无济于事。
    • 同样值得注意的是,从建议的帖子中添加命令名称属性的解决方案很有价值,因为它允许您在事件处理程序中确定哪个命令按钮被按下。然而,我遇到的问题是进程永远不会进入事件处理程序,因此我永远没有机会评估命令名称。这也不能解释为什么几乎完全相同实现的 Repeater 可以工作,而 ListView 和 GridView 不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2012-05-06
    相关资源
    最近更新 更多