zukucode
主にWEB関連の情報を技術メモとして発信しています。

ASP.NET Repeater内のコントロールにアクセスする方法

ASP.NETRepeater内のコントロールにアクセスする方法を紹介します。

runat=serverをつける

Repeater内のコントロールに限らず、サーバー処理でコントロールにアクセスしたい場合はrunat="server"を設定します。

runat="server"を設定しておけば、テキストボックスなどのコントロールだけではなく、divtableなどの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)
Next

ItemDataBoundイベント

データをバインドしたタイミングでRepeater内のコントロールに値をセットしたい場合があります。

バインドしたアイテム1件毎にItemDataBoundイベントが走るので、ここでRepeater内のコントロールにアクセスし、値の設定やスタイルの変更などを行います。

(例えば3行のデータがあるDataTableをバインドしたら3回ItemDataBoundイベントが発生する)

以下のDataTableをバインドしたとします。

first_namedelflg
一郎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

関連記事