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



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

这是一个场景…

我有一个Repeater和一个ListView绑定到同一个数据源。每个控件都包含一个ASP:LinkButton,当单击它时,应该触发OnItemCommand事件。尽管它们在页面生命周期中完全相同的位置连接到完全相同的数据,并且为页面和每个单独的控件启用了viewstate,但Repeater似乎会触发事件,而ListView则不会。

我知道如果数据没有在事件处理程序的赋值之前绑定,事件将不会触发。我依靠ViewState来重新填充控件,当页面被张贴回。在调试模式下查看每个控件,同时通过一个请求,我可以看到,Repeater确实似乎重新填充了ViewState数据,但ListView没有。

由于它们的生成、填充、绑定和处理几乎完全相同,我完全不明白为什么会发生这种情况。我也注意到一个类似的问题与GridView控件(它不触发事件)。我想这些是有联系的。

我能想到的GridView和ListView唯一的共同点是Repeater没有的,那就是内置的分页功能。无论是否实现分页是否会影响ViewState的加载?

OrderControl。ASCX 是一个控件,它将ListView和Repeater作为属性(OrderListLV &

    <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 . asx . 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);
    }

总之,当我单击每个控件中的LinkButton时,Repeater的ItemCommand处理程序启动并正确执行,但该过程甚至没有进入ListView处理程序的处理程序。

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

谢谢,加里。

你应该在ListView中设置每个LinkButton的CommandName属性,最终也要设置CommandArgument

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

在发布新问题之前,请检查SO中的问题;-)

listview OnItemCommand dosen't fire up

相关内容

  • 没有找到相关文章