2015-11-18 4 views
0

Как читать данные из родительского ретранслятора?Как читать данные из родительского ретранслятора?

<asp:Repeater ID="rpt" runat="Server"> 
    <ItemTemplate> 
     <%# DataBinder.Eval(Container.DataItem, "MyRepeaterDataItem")%> 

     <asp:GridView ID="gv" runat="Server"> 
     <Columns> 
      <asp:TemplateField> 
      <HeaderTemplate> 
       <%# DataBinder.Eval(Container.DataItem, "MyRepeaterDataItem")%> 
      </HeaderTemplate> 
      <ItemTemplate> 
       TEXT 
      </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
     </asp:GridView> 

    </ItemTemplate> 
    </asp:Repeater> 

Я пытаюсь получить DataItem MyRepeaterDataItem принадлежащего ретранслятора, чтобы появляться в заголовке вложенной GridViews.

Я попытался с помощью .Parent и .NamingContainer, но не может получить правильный синтаксис, используя VB.NET

ответ

1

Предполагая, что вы связываете Datasource к GridView в ItemDataBound обработчика событий в RepeaterItem вы можете в проволочных обработчик для в RowCreated (или DataBound) события с помощью AddHandler GridView:

Private Sub rpt_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles rpt.ItemDataBound 
    If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then 
     AddHandler gvTarget.RowCreated, AddressOf GridViewRowCreated 
     'Bind your Datasource to the GridView AFTER you wire it up: 
     'Dim gvTarget As GridView = CType(e.Item.FindControl("gv"), GridView) 
     'gvTarget.DataSource = lstYourDataSource 
     'gvTager.DataBind() 
    End If 
End Sub 

Тогда обработчик событий для RowCreated ГВ может получить значение от родительского RepeaterItem:

Public Sub GridViewRowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    Dim lblHeader As Label = CType(e.Row.FindControl("lblGridViewHeader"), Label) 
    'Check due to Header/Footer. 
    If Not lblHeader Is Nothing Then 
     lblHeader.Text = DataBinder.Eval(CType(sender.Parent, RepeaterItem).DataItem, "MyRepeaterDataItem") 
    End If 
End Sub 

Вышеуказанный код требует, чтобы добавить ярлык к вашему HeaderTemplate GridView в:

<asp:GridView ID="gv" runat="Server"> 
    <Columns> 
     <asp:TemplateField> 
     <HeaderTemplate> 
      <asp:Label ID="lblGridViewHeader" runat="server"></asp:Label> 
     </HeaderTemplate> 
     <ItemTemplate> 
      TEXT 
     </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    </asp:GridView> 

Или, возможно вы могли бы просто сделать это в GridViewRowCreated:

e.Row.Cells(0).Text = DataBinder.Eval(CType(sender.Parent, RepeaterItem).DataItem, "MyRepeaterDataItem") 
+0

Так что, возможно, это связано только с сеткой? '<% # DataBinder.Eval (CType (sender.Parent, RepeaterItem) .DataItem," MyRepeaterDataItem ")%>' – Obsidian

0

Получить родительский элемент данных из Любой Nested Control

После небольшой проб и ошибок я разработал простое решение, которое может работать без какого-либо кода.

VB.NET

<HeaderTemplate> 
    <%# DataBinder.Eval(Container, "NamingContainer.NamingContainer.DataItem.MyRepeaterDataItem")%> 
</HeaderTemplate> 

MyRepeaterDataItem Где находится столбец данных.