ASP.NET Repeater内のコントロールにアクセスする方法
ASP.NETでRepeater内のコントロールにアクセスする方法を紹介します。
runat=serverをつける
Repeater内のコントロールに限らず、サーバー処理でコントロールにアクセスしたい場合はrunat="server"を設定します。
runat="server"を設定しておけば、テキストボックスなどのコントロールだけではなく、divやtableなどのhtmlの要素もアクセスできます。
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" />
</ItemTemplate>
</asp:Repeater>FindControlで取得する
以下のように、Repeaterにバインドしたアイテムをループで回しながらFindControlでコントロールを取得します。
For Each item As RepeaterItem In Repeater1.Items
Dim TextBox1 As TextBox = CType(item.FindControl("TextBox1"), TextBox)
Dim Button1 As Button = CType(item.FindControl("Button1"), Button)
NextItemDataBoundイベント
データをバインドしたタイミングでRepeater内のコントロールに値をセットしたい場合があります。
バインドしたアイテム1件毎にItemDataBoundイベントが走るので、ここでRepeater内のコントロールにアクセスし、値の設定やスタイルの変更などを行います。
(例えば3行のデータがあるDataTableをバインドしたら3回ItemDataBoundイベントが発生する)
以下のDataTableをバインドしたとします。
| first_name | delflg |
|---|---|
| 一郎 | 1 |
| 次郎 | 0 |
| 三郎 | 0 |
| 四郎 | 1 |
Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
Select Case e.Item.ItemType
Case ListItemType.Item, ListItemType.AlternatingItem
Dim TextBox1 As TextBox = CType(e.item.FindControl("TextBox1"), TextBox)
'値を設定
TextBox1.Text = CType(e.Item.DataItem, DataRowView).Item("first_name").ToString
Dim Button1 As Button = CType(e.item.FindControl("Button1"), Button)
If CType(e.Item.DataItem, DataRowView).Item("delflg").ToString = "1" Then
'delflg=1のデータはスタイルを設定
Button1.Style.Add("background-color", "red")
End If
End Select
End Sub