連載:VS 2005でいってみようDBプログラミング第4回 テンプレート機能でGridViewコントロールも自由自在山田 祥寛(http://www.wings.msn.to/)2006/05/31 |
|
|
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イベントを利用することで、更新前のタイミングで動的にパラメータをデータソース・コントロールに引き渡すことが可能です。例えば、本サンプル・プログラムならば、以下のように記述します。
FindControlメソッドは、指定されたID値をキーに現在のコントロール(この場合はグリッド行)配下に含まれる子コントロールを検索します。FindControlメソッドは戻り値をControlオブジェクト*2として返しますので、使用するに当たってはDirectCastステートメントを使用して、適切なコントロールの型にキャストする必要があります。
また、データソース・コントロール(SqlDataSource)で定義されたパラメータにアクセスするには、イベント・ハンドラの第2パラメータとして受け取ったGridViewUpdateEventArgsオブジェクトからNewValuesプロパティを使用します。これによって、データソース・コントロールで定義されたパラメータの値の取得/設定が可能になります。 もちろん、Eval/Bindメソッドを適切に使い分ければ、このようなコードをあえて記述する必要はありませんが、入力値を何かしら加工したうえでデータベースに渡したいという場合には使えるテクニックです。 |
■入力チェックを行うには検証コントロールを利用する
GridViewコントロールに限りませんが、アプリケーション上でデータの登録や更新をエンドユーザーの入力値に基づいて行う場合、入力値の正否を検証する機能は欠かせません。例えば、本サンプル・プログラムでも刊行日の欄に正しく日付が入力されているかどうかをチェックする必要がありますし、単価欄では値が正数値で入力されているかを確認する必要があります。
ASP.NETでは、これら入力値の検証を行うために「検証コントロール」と呼ばれるサーバ・コントロールを提供しています。ASP.NET 2.0で利用可能な検証コントロールは以下のとおりです。
|
||||||||||||
表5 ASP.NETで利用可能な検証コントロール | ||||||||||||
また、これら検証コントロールによる検証結果をサマリ表示するためのコントロールとして、ValidationSummaryコントロールがあります。ValidationSummaryコントロールはほかの検証コントロールとは異なり、それ自体は検証処理を行いません。その名のとおり、ほかの検証コントロールが行った検証の結果をサマリ表示するためのコントロールです。
個々の検証コントロールは、それ自体もエラー・メッセージを表示するための機能を提供しますが、(例えば)グリッド上の各列に直接にエラー・メッセージを表示するのは、レイアウト上、好ましいことではありません。そこで個々の検証コントロールではエラー個所を表すための印(本サンプルでは「*」)だけを表示しておき、具体的なエラー・メッセージはValidationSummaryコントロールに委ねるというわけです。
以下に、それぞれの検証コントロールで利用可能な主なプロパティを挙げておきましょう。「共通」のプロパティはValidationSummary以外のコントロールで共通して利用できます。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
表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)の以下の太字部分です。
ただし、ユーザー・インスタンス機能はSQL Server 2005でもExpress Editionでしか利用できません。Standard以上の上位エディションでは利用できませんので注意してください。 |
まとめ
以上、今回はGridViewコントロールのTemplateFieldフィールドを利用してグリッド上の列レイアウトをカスタマイズする方法について紹介しました。
TemplateFieldフィールドには、基本的にページに配置するのとまったく同じ要領で、サーバ・コントロールを配置できますので、TemplateFieldフィールドとデータバインド式さえ理解してしまえば、GridViewコントロール1つで、実にさまざまなレイアウトを作成できます。
単にサンプル・コードを動かして終わりとするのではなく、ぜひ皆さん自身でもサンプル・コードを改変するなど諸々遊んでみてください。その遊びの中できっと新たな発見があるはずです。
INDEX | ||
Visual Studio 2005でいってみようDBプログラミング | ||
第4回 テンプレート機能でGridViewコントロールも自由自在 | ||
1.グリッド上の入力コントロールをカスタマイズしよう | ||
2.TemplateFieldフィールドを適用する | ||
3.TemplateFieldフィールド適用のポイントを理解する | ||
「Visual Studio 2005でいってみようDBプログラミング」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|