2013-02-28 94 views
1

我有一个中继器:访问嵌套转发的数据源

<asp:Repeater ID="rptSessions" runat="server">

这里面我有另一个中继器:

<asp:Repeater ID="rptPeople" runat="server" OnItemDataBound="rptPeople_ItemDataBound"> 

在的ItemDataBound我的父母中继器,我设置为数据源儿童中继器。

Dim dtPeople As New DataTable 
    dtPeople.Columns.Add("FirstName") 
    dtPeople.Columns.Add("LastName") 
    dtPeople.Columns.Add("Company") 
    If e.Item.DataItem("Lunch") = True Then dtPeople.Columns.Add("Dietary") <-- *** 
    rptPeople.DataSource = dtPeople 
    rptPeople.DataBind() 

现在考虑的HTML为我的孩子中继

<asp:Repeater ID="rptPeople" runat="server" OnItemDataBound="rptPeople_ItemDataBound"> 
    <HeaderTemplate> 
    <table> 
     <tr> 
     <th>First Name</th> 
     <th>Last Name</th> 
     <th>Company</th> 
     <asp:Literal ID="litDietaryRequirements" runat="server"><th>Dietary Requirements</th></asp:Literal> 
     </tr> 
    </HeaderTemplate> 
    ..... 

在的ItemDataBound为我的孩子我直放站想隐藏取决于列Dietary是否存在于它的数据源litDietaryRequirements。我试过如下:

If e.Item.ItemType = ListItemType.Header Then 
    DirectCast(e.Item.FindControl("litDietaryRequirements"), Literal).Visible = DirectCast(e.Item.DataItem, DataRowView).Row.Table.Columns.Contains("Lunch") 
End If 

e.Item.DataItem强制转换似乎没有什么

+2

DataItem的始终是'ListItemType.Header'没有。也许这有助于:http://stackoverflow.com/questions/1411336/accessing-parent-data-in-nested-repeater-in-the-headertemplate – 2013-02-28 13:46:09

+0

谢谢蒂姆,最后我使用父数据源的值来隐藏文字。 'DirectCast(DirectCast(e.Item.NamingContainer.NamingContainer,RepeaterItem).DataItem,DataRowView).Row.Item(“Lunch”)' – 2013-02-28 14:24:15

+0

@JackPettinger:这个答案是否解决?如果是这样,恕我直言,最好的办法是发布您的解决方案作为答案。这样,任何有类似问题的人都可以从你的答案中受益。 – 2013-02-28 15:04:31

回答

0

最后,我这样做:

If e.Item.ItemType = ListItemType.Header Then 
    Dim LunchRequired As Boolean = DirectCast(DirectCast(e.Item.NamingContainer.NamingContainer, RepeaterItem).DataItem, DataRowView).Row.Item("Lunch") 
    DirectCast(e.Item.FindControl("litDietaryRequirements"), Literal).Visible = LunchRequired 
End If