2012-12-10 32 views
0

我有一个中继器嵌套在父Repeater的ItemTemplate中。我通常用标记将它们连接到控件声明。嵌套中继器 - ItemCommand只有通过标记连接才会触发

<asp:Repeater runat='server' id='myParentRepeater'> 
    <ItemTemplate> 
     <asp:Repeater runat='server' id='mynestedRepeater' OnItemCommand='myMethod'> 
      ... 
     </asp:Repeater> 
     ... 
    </ItemTemplate> 
</asp> 

今天,我决定做它的代码隐藏,特别是在父母的ItemDataBound方法repeater./

((Repeater)e.item.FindControl("MyParentRepeater")).ItemCommand += ... 

但它不会以这种方式工作。除非我使用标记,否则事件处理程序不会触发。为什么是这样?或者,假设它应该工作,有人可以告诉我我做错了什么?

回答

3

ItemDataBound事件仅在Repeater为数据绑定且未在每次回发时触发。但事件必须在每次回寄中重新创建。因此请使用ItemCreated事件。

protected void myParentRepeater_ItemCreated(Object Sender, RepeaterItemEventArgs e) { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 
      ((Repeater)e.item.FindControl("MyParentRepeater")).ItemCommand += ... 
     } 
}  
+0

是否在每次回发'ItemCreated'火?无论控制权是否反弹?我一直认为接线是用javascript来完成的,它可以持续回传... – 5arx

+1

@ 5arx:是的,'ItemCreated'是当项目(或者在GridView的情况下是行并且它是'RowCreated' - 事件)被重新创建。这就是控件实际创建的地方。 –

1

ADD

OnItemCommand="repNested_ItemCommand" 

<asp:Repeater ID="rptNested" runat="server" OnItemCommand="repSales_ItemCommand"> 

代码隐藏:

Protected Sub repNested_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) 


Select Case e.CommandName 
// Do whatever you want