連載:VS 2005でいってみようDBプログラミング

第4回 テンプレート機能でGridViewコントロールも自由自在

山田 祥寛(http://www.wings.msn.to/
2006/05/31
Page1 Page2 Page3

TemplateFieldフィールド適用のポイントを理解する

 今回のポイントとなる点は3点です。以下に、これらを順に説明していきます。

■EvalメソッドとBindメソッド

 TemplateFieldフィールドではデータベースから取得した値を列にバインドするために、(カスタム)バインド式を利用できます。カスタム・バインド式の一般的な構文は、以下のとおりです。

Bind(バインドするフィールド名 [,書式文字列])

 これによって、指定したプロパティ値に対してフィールド値がバインドされるというわけです。Bindメソッドの第2パラメータとして、バインドしたフィールド値を整形するための書式文字列を指定することも可能です。

 例えば、テンプレート編集モードから[Column[3] 出版社 ItemTemplate]のLabelコントロールを確認してみましょう。[Labelタスク]メニューから[DataBindingsの編集]を選択し編集ダイアログを開くと、カスタム・バインド式として、

Bind("price", "{0:#,###}円")

とあるのが確認できるはずです。書式文字列の構文については、第3回で詳述していますので、併せて参照してみてください。

 さて、このようにTemplateFieldフィールドにデータをバインドする場合には、シンプルな構文で指定することが可能ですが、1点だけ注意すべき点があります。というのも、「バインド式には正確には2種類の記法がある」という点です。

 例えば、先ほどのDropDownList.SelectedValueプロパティに対するカスタム・バインド式は、以下のようにEvalメソッドを使用して記述することも可能です(Evalメソッドの構文は、Bindメソッドと同様です)。

Eval("publish")

 Evalメソッドを使用した場合にも、一見、プルダウン・メニューにbooksテーブル上の現在値が反映されているように見えます。しかし、編集モードから値を変更したうえで[更新]ボタンをクリックすると、どうでしょう。プルダウン・メニューから変更された内容が反映されていないことが確認できるはずです。

 ここで理解しておかなければならないのは、Bindメソッドによるデータバインドが両方向バインドであるのに対して、Evalメソッドによるデータバインドが片方向であるという点です。

 ここでいう両方向とは、バインドされた値に対する変更はデータソース・コントロールに対してフィードバックされるということを、片方向とはバインド値に対する変更はフィードバックされないということを、それぞれ意味します。つまり、更新目的のデータバインドを行う場合にはBindメソッドで、参照目的のデータバインドを行う場合にはEvalメソッドを使用しなければならないということになります。

 EditItemTemplateなど更新目的のテンプレートに対して、Evalメソッドでデータをバインドしてしまうと、更新内容がデータベースに反映されませんので注意してください。

[コラム]データソース・コントロールに動的にパラメータを引き渡す

 Evalメソッドを利用した場合にも、GridView.RowUpdatingイベントを利用することで、更新前のタイミングで動的にパラメータをデータソース・コントロールに引き渡すことが可能です。例えば、本サンプル・プログラムならば、以下のように記述します。

Protected Sub grid_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)

   ' 更新対象行をGridViewRowオブジェクトとして取得
  Dim row As GridViewRow = grid.Rows(e.RowIndex)

   ' 行に含まれる個々のコントロールを取得
  Dim publish As DropDownList _
    = DirectCast(row.FindControl("ddlPublish"), DropDownList)
  Dim price As TextBox _
    = DirectCast(row.FindControl("txtPrice"), TextBox)
  Dim publishDate As TextBox _
    = DirectCast(row.FindControl("txtPublishDate"), TextBox)

   ' コントロールの値をパラメータにセット
  e.NewValues("publish") = publish.SelectedValue
  e.NewValues("price") = price.Text
  e.NewValues("publishDate") = publishDate.Text
End Sub
RowUpdatingイベント・ハンドラによるデータソースの更新

 FindControlメソッドは、指定されたID値をキーに現在のコントロール(この場合はグリッド行)配下に含まれる子コントロールを検索します。FindControlメソッドは戻り値をControlオブジェクト*2として返しますので、使用するに当たってはDirectCastステートメントを使用して、適切なコントロールの型にキャストする必要があります。


*2 Controlオブジェクトは、すべてのサーバ・コントロールの基本機能が定義されたオブジェクトです。ASP.NETで利用可能なすべてのサーバ・コントロールは、Controlオブジェクトを継承しています。

 また、データソース・コントロール(SqlDataSource)で定義されたパラメータにアクセスするには、イベント・ハンドラの第2パラメータとして受け取ったGridViewUpdateEventArgsオブジェクトからNewValuesプロパティを使用します。これによって、データソース・コントロールで定義されたパラメータの値の取得/設定が可能になります。

 もちろん、Eval/Bindメソッドを適切に使い分ければ、このようなコードをあえて記述する必要はありませんが、入力値を何かしら加工したうえでデータベースに渡したいという場合には使えるテクニックです。

■入力チェックを行うには検証コントロールを利用する

 GridViewコントロールに限りませんが、アプリケーション上でデータの登録や更新をエンドユーザーの入力値に基づいて行う場合、入力値の正否を検証する機能は欠かせません。例えば、本サンプル・プログラムでも刊行日の欄に正しく日付が入力されているかどうかをチェックする必要がありますし、単価欄では値が正数値で入力されているかを確認する必要があります。

 ASP.NETでは、これら入力値の検証を行うために「検証コントロール」と呼ばれるサーバ・コントロールを提供しています。ASP.NET 2.0で利用可能な検証コントロールは以下のとおりです。

コントロール 検証内容
RequiredFieldValidator フォーム要素に値が入力されているか
RangeValidator フォーム要素の値が指定範囲に収まっているか
RegularExpressionValidator フォーム要素の値が指定された文字列パターンに合致するか
CompareValidator 複数のフォーム要素の値を比較し、大小関係などを満たしているか
CustomValidator 自前で定義した検証ルールを満たしているか
表5 ASP.NETで利用可能な検証コントロール

 また、これら検証コントロールによる検証結果をサマリ表示するためのコントロールとして、ValidationSummaryコントロールがあります。ValidationSummaryコントロールはほかの検証コントロールとは異なり、それ自体は検証処理を行いません。その名のとおり、ほかの検証コントロールが行った検証の結果をサマリ表示するためのコントロールです。

 個々の検証コントロールは、それ自体もエラー・メッセージを表示するための機能を提供しますが、(例えば)グリッド上の各列に直接にエラー・メッセージを表示するのは、レイアウト上、好ましいことではありません。そこで個々の検証コントロールではエラー個所を表すための印(本サンプルでは「*」)だけを表示しておき、具体的なエラー・メッセージはValidationSummaryコントロールに委ねるというわけです。

 以下に、それぞれの検証コントロールで利用可能な主なプロパティを挙げておきましょう。「共通」のプロパティはValidationSummary以外のコントロールで共通して利用できます。

コントロール プロパティ名 設定値
共通 ControlToValidate 検証対象のコントロール(ID値)
Display エラー・メッセージの表示方法(None|Static|Dynamic)
EnableClientScript クライアント・サイド検証は有効か
ErrorMessage エラー時にValidationSummaryコントロールに渡すエラー・メッセージ
SetFocusOnError エラー発生時に検証対象のコントロールにフォーカスを移動するか
Text 検証失敗時に検証コントロール上に表示するテキスト*3
ValidationGroup 検証グループ*4
RequiredFieldValidator InitialValue 初期値
RangeValidator MaximumValue 入力可能な最大値
MinimumValue 入力可能な最小値
Type データ型(String|Integer|Double|Date|Currency)
CompareValidator ControlToCompare 比較するコントロール(ID値)
ValueToCompare 比較する値
Operator 比較に使用する演算子(DataTypeCheck|Equal|GreaterThan|GreaterThanEqual|LessThan|LessThanEqual|NotEqual)
Type データ型(String|Integer|Double|Date|Currency)
RegularExpressionValidator ValidationExpression 正規表現パターン
CustomValidator ClientValidationFunction 検証に使用するクライアント・サイド関数
ValidateEmptyText テキストが空である場合も検証を行うか
ValidationSummary DisplayMode 表示モード(BulletList|List|SingleParagraph)
HeaderText サマリの先頭に表示されるリード文
ShowMessageBox サマリしたエラー情報をダイアログ表示するか
ShowSummary サマリしたエラー情報をページ上にインライン表示するか
表6 検証コントロールで利用可能な主なプロパティ 太字は設定が必須)
*3 省略時はErrorMessageプロパティの値を使用します。
*4 検証グループは、検証コントロールの適用範囲を定義するための情報です。詳細については、「.NET TIPS:[ASP.NET]複数のボタンを持つフォームで検証コントロールを利用するには?」などを参考にしてください。

■ボタン・クリック時に実行するクライアント・サイド・スクリプトを定義する

 OnClientClickプロパティを使用することで、ボタン・クリック時に実行するクライアント・サイド・スクリプトを定義することができます。

 本サンプル・プログラムの例では、[削除]ボタンに対して、

return confirm('本当に削除しても良いですか?')

というJavaScriptを関連付けることで、[削除]ボタンをクリックしたタイミングで削除確認のダイアログを表示できるというわけです。確認ダイアログで[いいえ]ボタンをクリックした場合には、削除処理はキャンセルされますので、誤ってデータを削除してしまうようなミスを未然に防ぐことができます。

[コラム]SQL Server 2005 Express Editionのユーザー・インスタンス

 SQL Server 2005 Express Editionでは、データベースの配布を容易にするための「ユーザー・インスタンス」という機能が備わりました。ユーザー・インスタンスとは、自分のアカウントでSQL Serverのサービスを実行する機能のことをいい、本機能を利用することで、指定された「.mdf」ファイルをアプリケーションの実行中のみ自動的にSQL Serverに登録(アタッチ)することができます。

 従来、SQL Server上のデータベースをほかの環境にコピーするには、いったん、現在のデータベースをデタッチ(登録解除)したうえで、移行先のSQL Serverに対してアタッチする必要がありましたが、ユーザー・インスタンスを利用することで、Microsoft Accessの「.mdb」ファイルと同様の要領で、「.mdf」ファイルを配布できるようになります。

 ちなみに、ユーザー・インスタンスを有効にしているのは、第2回でも紹介しているデータベース接続文字列(Web.config)の以下の太字部分です。

<add name="myDb" connectionString="Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\MyDB.mdf; Integrated Security=True; User Instance=True" providerName="System.Data.SqlClient" />
データベース接続文字列におけるユーザー・インスタンスの有効化(太字部分)

 ただし、ユーザー・インスタンス機能はSQL Server 2005でもExpress Editionでしか利用できません。Standard以上の上位エディションでは利用できませんので注意してください。

まとめ

 以上、今回はGridViewコントロールのTemplateFieldフィールドを利用してグリッド上の列レイアウトをカスタマイズする方法について紹介しました。

 TemplateFieldフィールドには、基本的にページに配置するのとまったく同じ要領で、サーバ・コントロールを配置できますので、TemplateFieldフィールドとデータバインド式さえ理解してしまえば、GridViewコントロール1つで、実にさまざまなレイアウトを作成できます。

 単にサンプル・コードを動かして終わりとするのではなく、ぜひ皆さん自身でもサンプル・コードを改変するなど諸々遊んでみてください。その遊びの中できっと新たな発見があるはずです。End of Article


 INDEX
  Visual Studio 2005でいってみようDBプログラミング
  第4回 テンプレート機能でGridViewコントロールも自由自在
    1.グリッド上の入力コントロールをカスタマイズしよう
    2.TemplateFieldフィールドを適用する
  3.TemplateFieldフィールド適用のポイントを理解する
 
インデックス・ページヘ  「Visual Studio 2005でいってみようDBプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間