2008-12-23 54 views
0

这与我的earlier question有关,但我想我会简化它并对其进行挑战。鉴于下面的代码,你可以从后面的代码中更改“ChangeThisLabel”的值吗?更改嵌套ListView的LayoutTemplate中的项目

<asp:ListView ID="OuterListView" runat="server"> 
    <LayoutTemplate> 
     <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <%#Eval("outer_value")%> <br/> 
     <asp:ListView ID="InnerListView" runat="server" DataSource='<%#Eval("inner") %>'> 
      <LayoutTemplate> 
       <asp:Label ID="ChangeThisLabel" runat="server" /> 
       <asp:PlaceHolder ID="itemPlaceHolder" runat="server" /> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <%#Eval("inner_value")%> <br/> 
      </ItemTemplate> 
     </asp:ListView> 
    </ItemTemplate> 
</asp:ListView> 

我建议提交答案之前,你自己尝试它,因为我得到了很多在我先前的职位,对于单一的ListView做工精细的建议,但对嵌套的ListView涨时落了下来。

回答

3

正如在其他答案中提到的那样。在后面的代码中,在加载时,可以这样做:

`OuterListView.FindControl("InnerListView").FindControl("ChangeThisLabel") 

然后将其转换为标签并更改文本。显然你会在一个循环内迭代这个代码,所以你可以为每个外部列表视图的内部列表视图中的每个标签执行此操作。

关于你的其他问题的答案,你不清楚你想从后面的代码访问它。您也可以发布您尝试过的内容,以便人们知道您尝试了不同的方法。

祝你好运!

编辑:关于您的评论:

除非我失去了一些东西,这是不行的,当它由内部的ListView呈现,因为 “ChangeThisLabel” 变成了 “ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder _OuterListView_ctrl0_InnerListView_ChangeThisLabel”

你是正确的,但是当你使用FindControl(id)时,它将使用服务器端id来查找控件。如果你这样做:InnerListView.FindControl(“ChangeThisLabel”),那么无论分配给该控件的客户端ID如何,它都会找到正确的标签。

1

在你的DataBound(或类似的东西)事件处理程序中使用FindControl("ChangeThisLabel")来获取对标签的引用。当然,在使用参考资料之前,您应该投入Label

您可能希望编写自己的FindControl方法,您将递归调用以找到级别为n的控件。

+0

除非我遗漏了一些东西,否则这将不起作用,因为“ChangeThisLabel”在由内部ListView呈现时变成“ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder_OuterListView_ctrl0_InnerListView_ChangeThisLabel”。 – gfrizzle 2008-12-23 21:41:31

+0

我的坏 - 我没有通过items集合来查找InnerListView,这就是为什么我没有任何运气。 – gfrizzle 2008-12-24 16:41:46