更改嵌套ListView的LayoutTemplate中的项目

时间:2008-12-23 21:26:31

标签: asp.net listview nested

这与我的earlier question有关,但我认为我会简化它并从中挑战。鉴于下面的代码,您可以从后面的代码中更改“ChangeThisLabel”的值吗?

<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时会出现问题。

2 个答案:

答案 0 :(得分:3)

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

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

然后将其作为标签投射并更改文本。很明显,你会在循环中迭代这段代码,这样你就可以为每个外部列表视图的内部列表视图中的每个标签执行此操作。

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

祝你好运!

编辑:关于你的评论:

  

除非我遗漏了某些东西,否则这将无效,因为“ChangeThisLabel”变为“ctl00_ctl00_BodyContentPlaceHolder_ReportContentPlaceHolder   _OuterListView_ctrl0_InnerListView_ChangeThisLabel“当它由内部ListView呈现时

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

答案 1 :(得分:1)

在您的DataBound(或类似的东西)中,事件处理程序使用FindControl("ChangeThisLabel")来获取对标签的引用。当然,在使用引用之前,您应该转换为Label

您可能想要编写自己的FindControl方法,您将以递归方式调用该方法以在n级找到控件。