asp.netのrepeaterで表示・編集・登録処理を行う その1

ASP.NETのWEBサーバコントロールのRepeaterコントロールを使用し、データの表示・編集・登録処理の流れの実装例を紹介します。

具体的には、DBに登録されているデータをRepeaterコントロールを使い、エクセルのような表形式で表示し、ユーザがデータを編集して、更新するという流れです。

下記のようにテキストボックス、ラジオボタン、チェックボックス、コンボボックスでそれぞれのパターンで編集できるようにします。

選手一覧
選手名国籍怪我キャプテン

Repeaterコントロールの基本

まず初めに、Repeaterの基本的な使い方について説明します。

RepeaterGridViewと同じように、データテーブルをバインドして、データテーブルの件数分、htmlを生成してくれるコントロールです。

データテーブルだけでなく、配列などもバインドすることができますが、今回は表形式で出力するため、データテーブルをバインドします。

Repeaterコントロールの中にhtmlサーバコントロールを定義

まずはユーザがデータを編集できるようにテキストボックスを定義します。

webサーバコントロールでも問題ありませんが、レスポンスをわかりやすくするためにhtmlサーバコントロールを使用します。

htmlサーバコントロールとwebサーバコントロールの違いについてはasp.netのhtmlサーバコントロールの基本asp.netのwebサーバコントロールの基本をご覧ください。

サーバ処理でコントロールにアクセスするためにrunat="server"をつけるのを忘れないようにします。

  • HeaderTemplateはバインドした際に1度だけ実行されます。
  • ItemTemplateはバインドしたデータの件数分実行されます。
  • FooterTemplateは最後に1度だけ実行されます。

今回はデータ件数分の行(tabletr要素)を出力するため、trItemTemplateの中に定義します。

国籍コンボボックスの中身はあらかめhtmlに定義しておいてもいいのですが、コンボボックスの中身もDBから読み込んで動的に設定することが多いので、この時点ではセットしません。

<table>
  <thead>
    <tr>
      <td>選手名</td>
      <td>国籍</td>
      <td>怪我</td>
      <td>キャプテン</td>
    </tr>
  </thead>
  <tbody>
    <asp:Repeater ID="repeater1" runat="server">
      <ItemTemplate>
        <tr>
          <td><input type="text" id="txtName" runat="server" /></td>
          <td><select id="selCountry" runat="server"></select></td>
          <td><input type="checkbox" id="chkInjure" runat="server" /></td>
          <td><input type="radio" id="rdoCap" runat="server" /></td>
        </tr>
      </ItemTemplate>
    </asp:Repeater>
  </tbody>
</table>

サーバ処理でレスポンスするhtmlを作成

まずはRepeaterにバインドするデータテーブルをDBなどから取得します。今回はバインドするデータテーブルの中身は下記のようにします。

DateTable変数の中身
NAMECOUNTRYINJURECAPTAIN
選手名1jp01
選手名2us10
選手名3jp00

このデータをRepeaterコントロールにバインドします。

repeater1.DataSource = dt
repeater1.DataBind()

しかし、バインドしただけではテキストボックスに値をセットしたり、チェックボックスにチェックをしたりすることはできません。

また、Repeaterの中に定義したコントロールはrunat="server"がついていても、そのままアクセスできません。例えばtxtName.value="test"としても、ビルドエラーになってしまいます(どの行のtxtNameかわからないので)。

取得するには対象の1行に対してFindControlを使用して取得します。

バインドしたあとにRepeaterコントロールにアクセスして、コントロールに値をセットしてもいいのですが、今回はRepeaterにはバインドしたら1行ごとに発生するItemDataBoundというイベントが用意されていますので、そのイベントの中でテキストボックスなどのコントロールに値をセットします。

Sub repeater1_ItemDataBound(Byval Sender As Object, _
                            Byval e As RepeaterItemEventArgs) Handles repeater1.ItemDataBound
    'HeaderTemplateとFooterTemplateのときは処理を飛ばします
    If e.Item.ItemType = ListItemType.Item Or _
        e.Item.ItemType = ListItemType.AlternatingItem Then
        '現在のバインドしている行を取得します DataTableをバインドした場合はDataRowViewになります
        Dim row As DataRowView = CType(e.Item.DataItem, DataRowView)
        'テキストボックスのコントロールを取得 e.Itemで現在の行のhtml(aspx)を取得できます
        Dim textControl As HtmlInputTextBox = CType(e.Item.FindControl("txtName"), HtmlInputTextBox)
        'コントロールにバインドしたデータの値をセットします
        textControl.value = row("NAME").ToString

        'コンボボックスのコントロールを取得
        Dim selectControl As HtmlSelect = CType(e.Item.FindControl("selCountry"), HtmlSelect)
        'コンボボックスの値をセットします
        selectControl.Add(new ListItem("日本", "jp"));
        selectControl.Add(new ListItem("アメリカ", "us"));
        'コントロールにバインドしたデータの値をセットします
        selectControl.value = row("COUNTRY").ToString

        'チェックボックスのコントロールを取得
        Dim checkboxControl As HtmlInputCheckBox = CType(e.Item.FindControl("chkInjure"), HtmlInputCheckBox)
        'コントロールにバインドしたデータの値をセットします
        If row("INJURE").ToString = "1" Then
          checkboxControl.checked = True
        Else
          checkboxControl.checked = False
        End If

        'ラジオボタンのコントロールを取得
        Dim radioControl As HtmlInputRadioButton = CType(e.Item.FindControl("rdoCap"), HtmlInputRadioButton)
        'コントロールにバインドしたデータの値をセットします
        If row("CAPTAIN").ToString = "1" Then
          radioControl.checked = True
        Else
          radioControl.checked = False
        End If
    End If
End Sub

埋め込みで値を出力する方法

バインドした変数などをclassic aspphpのように埋め込みで出力することもできます。

ASP.NETでも普通の変数なら<%= 変数名 %>で埋め込みで出力することができますが、RepeaterGridViewのようにバインドしたテーブルの値を出力したい場合は下記のような方法になります。

<%# DataBinder.Eval(Container.DataItem, "NAME") %>

なので、例えばtxtNameの値を埋め込みで出力する場合は下記のようになります。

<input type="text" id="txtName" runat="server" value='<%# DataBinder.Eval(Container.DataItem, "NAME") %>' />

これでクライアント側にデータを表示することが出来ました。しかし、RepeaterGridViewなどで動的に作成したhtmlのコントロールはIDやNAME属性が連番に置き換わってしまいます。

例えば1行目のtxtNameだと、repeater1_ctr0_txtNameなどになってしまいます。

置き換わる文字列は一見規則性があるように見えますが、環境によってパターンが変わったりします。

これがクライアント側での処理を少し複雑にしてしまいます。


関連記事

  • asp.netのrepeaterで表示・編集・登録処理を行う その2

    asp.netのrepeaterで表示・編集・登録処理を行う その1でRepeaterを使って、下記のようなhtmlを動的に出力することが出来ました。今回はクライアント側での入力制御とサーバ側での登録...


  • asp.net|repeaterで出力したラジオボタンを1つのみ選択する方法

    Repeaterの中にラジオボタンを定義して出力すると、下記のように複数選択できてしまいます。原因はRepeaterで出力する際にIDとNAME属性が変わってしまうためです。詳しくはaspnet-re...


  • asp.netのrepeaterで出力時にjavascriptのイベントを定義する

    asp.netのrepeaterで表示・編集・登録処理を行う その2でrepeaterを使って、表示→編集→登録の一連の流れが実装できました。今回は、表示→編集→登録のうち、編集について、もっと細かい...


  • asp.netのrepeaterで出力したコントロールにjavascriptでアクセスする

    ASP.NETのRepeaterで動的に出力したコントロールにjavascriptでアクセスする方法を紹介します。例として、登録ボタン押下時に、選手名のテキストボックスが未入力の場合はアラートを表示す...


  • asp.netのポストバックの基本

    aspでは、画面再表示時にテキストボックスなどのコントロールの値を保持・復元するためには、コントロールの値をsubmitし、サーバ処理でコントロールのプロパティに再セットして状態を復元する必要がありま...


  • asp.netのhtmlサーバコントロールの基本

    asp.netの基本・aspとの違いで紹介したコードはaspxファイルに(htmlレイアウトのファイル)に、まだstrNameやdetailなど、サーバ処理の変数が残っています。htmlサーバコントロ...


  • asp.netのイベントの基本と注意事項

    押下したボタンによってサーバ処理を分岐したい場合(例:登録ボタン、削除ボタン、検索ボタンなど)、いままでの方法では処理区分としてhiddenをsubmitし、処理を分岐していました。ASP.NETでは...


  • asp.netの基本・aspとの違い

    ここまでaspを用いてWEBアプリの基本を説明してきましたが、ここまでのサンプルコードを見てわかるように、aspはレスポンスするhtmlのレイアウトとサーバ処理が1つのファイルに記載しているため、複雑...


  • 地附山で自然に触れ合い心も体もリフレッシュ

    日常から抜けだして、自然に触れて心も体もリフレッシュしたいなら、長野県の地附山がおすすめです。トレッキングというよりもハイキングのような感じで、登山装備もいらずに気軽に歩けるのでおすすめスポットです。...


  • 須坂市の絶景スポット米子大瀑布の紹介

    8月の新緑の季節に行ってきました長野県須坂市の米子大瀑布の、壮大な自然が絶景でとても感動したので紹介します。米子大瀑布は、須坂市の山中にある2つの滝です。米子大瀑布にあるこれらの滝は日本の滝百選に選ば...