2011-09-20 88 views
2

我知道这听起来像其他一些帖子,所有我已阅读但没有解决我的问题。ASP.NET ListView控件没有触发OnItemCommand事件

这里的情景......

我都一直放站和绑定到同一数据源的一个ListView。每个控件都包含一个ASP:LinkBut​​ton,点击后应该触发OnItemCommand事件。虽然他们连接到EXACT相同的数据在EXACT相同的页面生命周期的相同位置和查看状态启用的页面和每个单独的控制Repeater似乎触发事件和ListView不。

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

由于这些都是生成,填充,绑定和处理差不多相同,我完全丧失了为什么会发生这种情况。我也注意到与GridView控件类似的问题(它不会触发事件)。我假设这些都是相关的。

,我能想到的,在GridView和ListView的共同点是,直放站不唯一的是内置分页功能。无论是否实现,是否存在与分页有关的事情,影响ViewState的加载?

OrderControl.ASCX是主机页/应用程序,它暴露了ListView和中继器作为属性对照(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的点击控制ItemCommand处理程序的中继火灾和正确执行,但过程中甚至没有进入为ListView处理程序处理程序中完成。

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

感谢, 加里

回答

0

你应该设置在ListView每个LinkBut​​ton的的CommandName财产,最终也CommandArgument

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

还发布了一个新问题;-)

listview OnItemCommand dosen't fire up

+0

我发布前一定研究,并花了一些时间看你的引用前后点击此处查看常见问题的SO。命令参数在OnItemDataBound处理程序中设置(它似乎省略了ListView上的OnItemDataBound处理程序,同时修剪了该帖子的代码,我将修复此问题)。此外CommandName没有为Repeater设置,它的工作原理......我最初的CommandName设置为无效。 –

+0

值得注意的是,从建议的帖子中添加命令名称属性的解决方案非常有用,因此您可以在事件处理程序中确定WHICH命令按钮被按下。但是,我遇到的问题是该进程从不进入事件处理程序,因此我从来没有机会评估命令名称。这也不能解释为什么几乎是IDENTICALLY实现的Repeater工作,而ListView和GridView则不工作。 –