SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

データバインドコントロール内で使用できるカスタムラジオボタンの作成

カスタムWebコントロールでレンダリング内容を修正する

  • このエントリーをはてなブックマークに追加

ダウンロード ソースコード (1.2 KB)

データバインドコントロール内では、コントロールのIDなどのプロパティがユニークになるような接頭辞が付加されます。これは、ラジオボタンのグループも対象となってしまうため、複数の要素にまたがってグループ化することができません。本稿では、コントロールを拡張して複数の要素にまたがるグループ化を行うラジオボタンを作成します。

  • このエントリーをはてなブックマークに追加

はじめに

 GridViewコントロールなどのデータバインドコントロール内では、コントロールのIDなどのプロパティがユニークになるような接頭辞が付加されます。これは、ラジオボタンのグループも対象となってしまうため、複数の要素にまたがってグループ化することができません。

 本稿では、コントロールを拡張して複数の要素にまたがるグループ化を行うラジオボタンを作成します。

対象読者

  • ASP.NETでのアプリケーションの開発者。
  • Web サーバー コントロールの開発経験があるとよい。

必要な環境

 Microsoft Visual Studio 2005上で動作確認しています。

現象

 冒頭に記した現象を確認するため、下記のページを作成します。

ASPXファイル(抜粋)
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:RadioButton ID="RadioButton1" runat="server"
          GroupName="Radio" Checked='<%# Eval("IsChecked") %>' />
      </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField DataField="Name" />
    <asp:BoundField DataField="Value" />
  </Columns>
</asp:GridView>

 このソースでは、テンプレート内のRadioButtonコントロールにGroupNameプロパティを設定して、すべてのItemTemplate内のラジオボタンからどれか1つを選択することを意図しています。

 これを実行すると、下記の表示が行われます。

実行結果
実行結果

 しかし、ラジオボタンを選択すると、複数選択できてしまいます。

実行結果
実行結果

 原因を確認するために、このページをソース表示して生成されたHTMLを確認します。

生成されたHTML
<tr>
  <td>
    <input id="GridView1_ctl02_RadioButton1" type="radio"
      name="GridView1$ctl02$Radio" value="RadioButton1" />
  </td><td>First</td><td>First Item</td>
</tr>
<tr>
  <td>
    <input id="GridView1_ctl03_RadioButton1" type="radio"
      name="GridView1$ctl03$Radio" value="RadioButton1" />
  </td><td>Second</td><td>Second Item</td>
</tr>
<tr>
  <td>
    <input id="GridView1_ctl04_RadioButton1" type="radio"
      name="GridView1$ctl04$Radio" value="RadioButton1"
      checked="checked" />
  </td><td>Third</td><td>Selected Item</td>
</tr>
<tr>
  <td>
    <input id="GridView1_ctl05_RadioButton1" type="radio"
      name="GridView1$ctl05$Radio" value="RadioButton1" />
  </td><td>Fourth</td><td>Fourth Item</td>
</tr>
<tr>
  <td>
    <input id="GridView1_ctl06_RadioButton1" type="radio"
      name="GridView1$ctl06$Radio" value="RadioButton1" />
  </td><td>Fifth</td><td>Fifth Item</td>
</tr>

 name属性に行ごとの接頭辞がついてしまうため、同一のグループとはみなされないのが原因のようです。

 アンケートページのように、行ごとに1項目を選択する場合にはこの挙動が必要になりますが、今回のように「縦方向」の対象から選択する場合には通常のRadioButtonコントロールではうまくいきません。

 前述の出力されたHTMLを見ると、変更したい部分は2点あります。

  • name属性から行ごとの接頭辞を外す。これは、グループ化するために必要となります。
  • value属性に行ごとの接頭辞をつける。これは、どのボタンが押されたかを判別するために必要となります。

 ASP.NETにおけるコントロールの描画はRenderメソッドで行われます。RadioButtonコントロールの場合、ここから呼ばれる仮想メソッドは特になさそうなので、このメソッドをオーバーライドすれば希望通りの描画が実現できます。しかし、この方法では描画のすべてを自前で行わなければならないので、別の方法を考えます。

メカニズム

 ASP.NETにおけるコントロールの描画は、下図の流れで行われます。

ASP.NETにおけるコントロールの描画
ASP.NETにおけるコントロールの描画

 コントロールのRenderメソッドで、HtmlTextWriterに対してエレメントや属性を登録してから描画すると、HtmlTextWriterはその内容をHTMLに直して、保持しているTextWriterに出力します。その結果、TextWriterがHTMLを出力します。

 このHtmlTextWriterTextWriterとの関係は、Decoratorパターンとなっています。

Decoratorパターン
Decoratorパターン

 Decoratorパターンは、もともとの処理とDecoratorが同じインターフェイスを実装し、Decoratorがそのインターフェイスを呼び出すことによって、複数のDecoratorを付加することができるようになるパターンです。

 すなわち、今回のコントロールの描画においても、もともとのHtmlTextWriterにさらにHtmlTextWriterを付加することができます。ここで、属性値を変更して出力することになります。

設計
設計

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
実装

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

にしざき(にしざき)

Team EntLib.jp - enterpriselibrary.jp を拠点として、国内における Enterprise Library の普及に向けて活動中。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/840 2007/01/24 12:04

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング