最近苦戦した話 ASP.NET Web Forms Repeaterの入れ子
1. はじめに
お久しぶりです。エンジニアの今井です。
結構前になりますが、自分の拠点がサテライトオフィスに変わりました。
電話も鳴らないし、とてもきれいでエンジニアが働きやすい環境になっており、仕事も捗ります!
w2の新しいサテライトオフィスが気になる人は、井上君が書いたこの記事を是非見てみて下さい!
さて、最近業務中にちょっと苦戦したことがありました。
調べてもあまりしっかりとした解決方法が見つからなかったので、少しは需要があるのでは?
そう思って今回はこんな記事を書いてみたので是非ご覧下さい。
2. 苦戦したポイント
やりたかったことはASP.NET Web FormsでRepeaterを入れ子状態にし、子階層のRepeaterの中で親階層のRepeaterのデータを参照することでした。(入れ子、ネスト、ネスト構造とかとも言われると思います。)一瞬でできると思っていたのですが、割と苦戦してしまったので、忘れないようにという意味も込めて共有しようと思います。(同じようなことを別のソースコードで発見したのは解決した後でした…)
苦戦した理由は、Repeaterを入れ子にすることは単純にRepeaterを2重に書けば問題なかったのですが、子階層のRepeaterの中で親階層のRepeaterのデータを参照する方法が分からなかったからです。
3. 肝心なソースコードは?
例として下記のようなクラスがあるとします。
ParentクラスはプロパティにChildクラスの配列Childrenを持ちます。
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public Child[] Children { get; set; }
}
public class Child
{
public string Id { get; set; }
public string Name { get; set; }
}
表示側ではParentの配列を持つParentsをRepeaterで表示しながら、子階層となるRepeaterの中でChildrenのNameとParentのIdを表示します。
<asp:Repeater ID="rParent" ItemType="Parent" Runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#: Item.Id %>
</td>
<td>
<%#: Item.Name %>
</td>
<td>
<asp:Repeater ID="rChild" DataSource="<%# Item.Children %>" ItemType="Child" Runat="server">
<%#: Item.Name + DataBinder.Eval(Container.Parent.Parent, "DataItem.Id").ToString() %><br>
</asp:Repeater>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
DataBinder.Eval(Container.Parent.Parent, "DataItem.id")
と記述することで子階層から親階層のデータを参照することができました。
4. まとめ
思っていた以上に苦戦してしまいましたが、無事やりたいことは実現できました。これからも実際にエンジニアとして働いている中で、つまづいたり工夫したことがあればどんどん記事にしていきたいと思います!