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

时间:2015-11-18 15:04:26

标签: asp.net vb.net gridview data-binding 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>

我试图让属于转发器的dataitem MyRepeaterDataItem出现在嵌套的gridviews标题中。

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

获取正确的语法

2 个答案:

答案 0 :(得分:1)

假设您将数据源绑定到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")

答案 1 :(得分:0)

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

经过一些试验和错误后,我制定了一个简单的解决方案,可以在没有任何代码的情况下工作。

<强> VB.NET

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

MyRepeaterDataItem是数据列。