在HeaderTemplate中访问嵌套重复器的父级数据

61

简单的问题,不确定是否有简单的答案!

下面是代码:(我已经大幅简化,使其更易于阅读)

<asp:Repeater runat="server>
    <ItemTemplate>
        <asp:Repeater runat="server">
            <HeaderTemplate>
                <h1>My header here for: <%# OuterContainer.DataItem.MyItemName %> </h1>
            </HeaderTemplate>
            <ItemTemplate>
                My items code here
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

在HeaderTemplate中,我如何访问父Repeater的DataItem?

5个回答

96
我已找到答案实际上是:
使用:
<HeaderTemplate>
    <%# ((RepeaterItem)Container.Parent.Parent).DataItem %>
</HeaderTemplate>

5
如果您在代码后台的ItemDataBound方法中:((RepeaterItem)e.Item.Parent.Parent).DataItem - drzaus
11
请使用.NamingContainer代替.Parent.Parent(后者可能不正确)。 - Tim Schmelter
3
但是我收到了这个错误信息:[InvalidCastException] 无法将类型为 'System.Web.UI.WebControls.Repeater' 的对象转换为类型 'System.Web.UI.WebControls.RepeaterItem'。 - sms
1
应将其转换为 Repeater,而不是 RepeaterItem:((Repeater)e.Item.NamingContainer.NamingContainer).DataItem - Thomas Higginbotham

43

保罗提供的解决方案对我没有用,但是这个可以:

<%# DataBinder.Eval(Container.Parent.Parent, "DataItem.YourProperty")%> 

1
你能告诉我为什么要使用 Container.Parent.Parent 而不是 Container.Parent 吗? - SamuraiJack
@Arbaaz 这将取决于您有多少“父级”,即层级。例如,父级的父级。如果你知道我的意思,它在逻辑上与jQuery的处理方式非常相似。 - JazziJeff
使用NamingContainer层次结构更好。从标记中可以理解NamingContainer层次结构,而Parent层次结构可能包含额外的控件,例如FormView生成的Table。 - Sarsaparilla
7
父级是ItemTemplate,父级的父级是Repeater。 - user3638471

11

这是一个旧的帖子,但似乎适合补充:

在我的情况下,我有两个嵌套的ASPxGridView控件(DevExpress),Container.Parent.Parent不起作用。

为了从子级访问父级的数据项,以下方法对我有用:

<%# DataBinder.Eval(Container.NamingContainer.NamingContainer, "DataItem.DbField")%>

4

如果我想要检索父重复器的属性,通常会这样做:

<%# DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "ThePropertyName")%>

0
我已经使用如下代码。两个Repeater充当父子级,以下是如何在子Repeater中获取ID列的父级值。
<%# DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "ID") %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接