0

How to read a dataitem from a parent repeater?

  <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>

I am trying to get the dataitem MyRepeaterDataItem belonging to the repeater to appear in the nested gridviews header.

I have tried using .Parent and .NamingContainer but cannot get the correct syntax using VB.NET

DreamTeK
  • 32,537
  • 27
  • 112
  • 171

2 Answers2

1

Assuming you're binding a Datasource to the GridView in the RepeaterItem's ItemDataBound Event Handler you can wire up a Handler for the RowCreated (or DataBound) Events of the GridView using AddHandler:

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

Then your Event Handler for gv's RowCreated can get the value from the parent 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

The code mentioned above requires you to add a label to your GridView's HeaderTemplate:

  <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>

Or optionally you could just do this in GridViewRowCreated:

e.Row.Cells(0).Text = DataBinder.Eval(CType(sender.Parent, RepeaterItem).DataItem, "MyRepeaterDataItem")
NoAlias
  • 9,218
  • 2
  • 27
  • 46
0

Get Parent Data Item From Any Nested Control

After a little trial and error I worked out a simple solution that can work without any code behind.

VB.NET

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

Where MyRepeaterDataItem is the data column.

DreamTeK
  • 32,537
  • 27
  • 112
  • 171