以下のようなことをやりたくて色々調べていました。
- asp:Repeater をネストさせたい。
- 子階層から親階層のデータを参照したい
出たといえば出たのですが、うーん、特に 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 を変数的なものに入れたりとか
何かもっとすっきり書けるなら書きたいんですけど、ないんでしょうかね?
ちょっと見つかりませんでしたけど。