LoginSignup
3
2

More than 5 years have passed since last update.

asp:Repeater のネスト

Last updated at Posted at 2013-12-02

以下のようなことをやりたくて色々調べていました。

  1. asp:Repeater をネストさせたい。
  2. 子階層から親階層のデータを参照したい

出たといえば出たのですが、うーん、特に 2 に関して、もっとすっきりした書き方はないのでしょうか…


データクラスの定義
' 親クラス
Public Class HogeInfo
    Public Property HogeId As String
    Public Property HogeName As String

    Public Property HogeSubInfoList As List(Of HogeSubInfo) = Nothing
End Class

' 子クラス
Public Class HogeSubInfo
    Public Property HogeSubId As String
    Public Property HogeSubName As String
End Class
テストデータ生成
Private Function CreaateHogeInfoList() As List(Of HogeInfo)
    Dim list As New List(Of HogeInfo)
    For i = 1 To 5
        Dim info As New HogeInfo With {
            .HogeId = String.Format("{0:D4}", i),
            .HogeName = "HOGE-" & i
        }

        If i = 1 then info.HogeSubInfoList = Me.CreateHogeSubInfoList(i, 2)
        If i = 4 then info.HogeSubInfoList = Me.CreateHogeSubInfoList(i, 1)

        list.Add(info)
    Next

    Return list
End Sub

Private Function CreateHogeSubInfoList(ByVal i As Integer, ByVal size As Integer) As List(Of HogeSubInfo)
    If size < 0 Then Return Nothing
    Dim list As New List(Of HogeSubInfo)
    If size = 0 Then Return list

    For j = 1 To size
        Dim subInfo As New HogeSubInfo With {
            .HogeSubId = String.Format("{0:D3}", i),
            .HogeSubName = "sub-" & i
        }
        list.Add(subInfo)
    Next
    Return list
End Function


リストの内容をRepeaterで表示(1階層)
<table>
  <asp:Repeater runat="server" ID="rptHogeInfoList" DataSource='<%# Me.HogeInfoList %>'>
  <ItemTemplate>
    <tr>
      <td><%#Container.ItemIndex + 1%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeId")%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeName")%></td>
    </tr>
  </ItemTemplate>
  </asp:Repeater>
</table>
リストの内容をRepeaterで表示(2階層)
<table>
  <asp:Repeater runat="server" ID="rptNestP" DataSource='<%# Me.HogeInfoList %>'>
  <ItemTemplate>
    <tr>
      <td><%#Container.ItemIndex + 1%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeId")%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeName")%></td>
      <td>

      <asp:Repeater runat="server" ID="rptNestC" DataSource='<%# Container.DataItem.HogeSubInfoList %>'>
        <ItemTemplate>
          <nobr>
          <%#DataBinder.Eval(CType(Container.Parent.Parent,RepeaterItem).DataItem, "HogeName")%>
          ( <%#DataBinder.Eval(Container.DataItem, "HogeSubName")%> )
          </nobr>
          <br />
        </ItemTemplate>
      </asp:Repeater>

      </td>
    </tr>
  </ItemTemplate>
  </asp:Repeater>
</table>



子 Repeat 内で

CType(Container.Parent.Parent,RepeaterItem).DataItem

とすれば親階層のデータは見れたのですが、
これは もし3 階層とかになったら Container.Parent.Parent.Parent.Parent とかになるんですかね。
Parentがいっぱいですよ。

Repeater の ID で指定したりとか
CType(Container.Parent.Parent,RepeaterItem).DataItem を変数的なものに入れたりとか
何かもっとすっきり書けるなら書きたいんですけど、ないんでしょうかね?
ちょっと見つかりませんでしたけど。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2