如何从 parent 中继器读取数据项?

How to read a dataitem from a parent repeater?

如何从 parent 转发器读取数据项?

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

我正在尝试让属于中继器的数据项 MyRepeaterDataItem 出现在嵌套的网格视图中 header。

我试过使用 .Parent.NamingContainer 但无法使用 VB.NET

获得正确的语法

假设您在 RepeaterItem 的 ItemDataBound 事件处理程序中将数据源绑定到 GridView,您可以使用 AddHandler 为 GridView 的 RowCreated(或 DataBound)事件连接一个处理程序:

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

然后 gv 的 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

上面提到的代码需要您在 GridView 的 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>

或者您可以选择在 GridViewRowCreated 中执行此操作:

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

从任何嵌套控件获取父数据项

经过反复试验,我找到了一个无需任何代码即可运行的简单解决方案。

VB.NET

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

其中MyRepeaterDataItem是数据列。