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

第3回 データアクセス/データソース・コントロールを使い倒せ!

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

グリッド表の内容をプルダウン・メニューで絞り込む

 ここまで見てきたように、GridViewコントロール配下のXxxxxFieldフィールドを設定するだけで、グリッド表を自在にカスタマイズ可能になります。続いては、何かしらの条件に応じてグリッド上のデータそのものを絞り込むという機能を追加してみましょう。そのような場合にも、SqlDataSourceコントロールを介することで、条件式の指定からパラメータの引き渡しまでをコーディングレスで行うことが可能です。

 本節では、先ほどのサンプルに、出版社を選択するためのプルダウン・メニューを追加し、選択された出版社に属する情報のみをグリッド表示する機能を追加してみます。


図3 プルダウン・メニューで選択された出版社に属する情報のみを表示

 それではさっそく、具体的な手順を見ていくことにしましょう。

[1]DropDownListコントロールを追加する

 ツールボックスからDropDownListコントロールをフォーム・デザイナ上に配置し、[DropDownListタスク]メニューから[データソースの選択]を選択します。


図4 [データソース構成ウィザード]
このウィザードは配置したDropDownListコントロールの[DropDownListタスク]メニューから開くことができる。ここでDropDownListコントロールのデータソースをデータベースのpublishフィールドにバインドする。

 [データソース構成ウィザード]が表示されますので、[データソースの選択]から「<新しいデータソース>」を選択します。すると、連載第2回でも紹介した[データソースの構成]ウィザードが起動しますので、同様の手順でデータソースの設定を行います。

 ただし、途中の[Selectステートメントの構成]ダイアログでは、取得列として「publish」(出版社)のみを選択するものとします。[完了]ボタンをクリックすると、元の[データソース構成ウィザード]に戻りますので、[DropDownListで表示するデータフィールドの選択][DropDownListの値のデータフィールドの選択]それぞれに「publish」を指定します。

 これで、データベースから取得したpublishフィールドの値がDropDownListコントロールの表示テキスト、オプション値としてバインドされたことになります。[OK]ボタンをクリックしてこのウィザードを完了します。デザイナ画面ではDropDownListコントロールの下にSqlDataSourceコントロールが配置され、DropDownListコントロールにもデータソース(この場合はbooksテーブル)の内容がバインドされていることが確認できるはずです。

[2]DropDownList/SqlDataSourceコントロールのプロパティを指定する

 続いて、[1]で追加したDropDownList/SqlDataSourceコントロールのプロパティを以下の表6の要領で設定します。

 ここで特に重要なのがAutoPostBackプロパティの設定です*。AutoPostBackプロパティがFalse(デフォルト)である場合、サンプルは正しく動作しませんので、注意してください(コラム「AutoPostBackプロパティ」を参照)。

コントロール プロパティ 設定値
DropDownList (ID) lstPub
AutoPostBack True
SqlDataSource DataSourceMode DataReader
表6 DropDownList/SqlDataSourceコントロールのプロパティ設定

* AutoPostBackプロパティは、[DropDownListタスク]メニュー上で「AutoPostBackを有効にする」にチェックを入れることでも設定可能です。

 ここで注目していただきたいのは、SqlDataSourceコントロールのDataSourceModeプロパティです。DataSourceModeプロパティは、SqlDataSourceコントロールがデータベースからデータを取得する際の取得モードを表します。

 本プロパティをデフォルトの「DataSet」に指定している場合、データは「DataSetオブジェクト」に読み込まれます。DataSetオブジェクトというのはメモリ上に常駐する仮想的なデータベースのようなものであり、内部的にテーブルやリレーションシップを表現できる高機能なオブジェクトです。DataSetオブジェクトを使用することで、取得したデータのソートやページング、キャッシュなどの機能を実現することが可能になります(コラム「SqlDataSourceコントロールのキャッシュ」を参照)。

 ただし、本サンプルのようにデータベースから読み込んだ情報をただプルダウン・メニューに出力するだけならば、なにもDataSetオブジェクトの高度な機能は必要ありません。そのような場合には、DataSourceModeプロパティに「DataReader」を指定してください。この場合、データは「前方への読み取り専用カーソル」である「IDataReaderオブジェクト」に読み込まれます。

 IDataReaderオブジェクトは、ソートやページング、キャッシュなどの機能を備えていない代わりに、より軽量で高速なデータ読み込みの手段を提供します。DataSetオブジェクト固有の機能を利用したいというケースを除いては、できるだけ「DataReader」を指定することを強くお勧めします(DataSetオブジェクトやIDataReaderオブジェクトについては本連載の後半で解説予定です)。

[コラム]AutoPostBackプロパティ

 「プルダウン・メニューの選択内容が変更された」「テキストボックス内のテキストが変更された」などのイベントのことを「変更系イベント」といいます。ASP.NETでは、こうした変更系イベントが(デフォルトでは)プールされる(すぐにはサーバ側に送信されない)ので注意が必要です。

 例えば、本文のサンプルにおいて、[DropDownListタスク]メニューから[AutoPostBackを有効にする]のチェックを外して実行してみましょう。すると、プルダウン・メニューの内容が変更されても、グリッド表の内容がリアルタイムには切り替わらないことが確認できるはずです。

 連載第1回でも紹介したように、ASP.NETのイベントドリブン・モデルは常にイベント処理をサーバ側で行います。つまり、ユーザーの何らかの操作があるたびにイベントが発生し、そのイベントはポストバック(=フォーム・データのサブミット)によりサーバへ伝えられます。

 しかし、ボタンをクリックしたときなどに発生するクリック系イベントに比べて、変更系イベントはユーザーが意識せず、かつ、頻繁に発生する可能性があり、変更系イベントが起こるたびに通信が発生するのではたまりません。そんな理由でASP.NETでは変更系イベントはいったんプールしておき、クリック系イベントが発生したタイミングでまとめてサーバに送信する仕組みを採用しています。

 もっとも、本稿のサンプルのように変更系イベントが発生したタイミングで、それをリアルタイムに処理したいという場合もあります。そのような場合には、自動ポストバック(AutoPostBackプロパティ)を有効に設定することで、変更系イベントが発生したタイミングでリアルタイムにポストバックが行われます。

 ただし繰り返しではありますが、自動ポストバックを有効にすることで、サーバ/クライアント間の通信が増加し、アプリケーションとしての使い勝手を悪くする可能性もあります。有効にする場合には、十分にその必要性を検討したうえで行ってください。

[コラム]SqlDataSourceコントロールのキャッシュ機能

 SqlDataSourceコントロール上でデータのキャッシュを有効にするには、EnableCachingプロパティをTrueに指定します。キャッシュが有効化された場合、CacheDurationプロパティで指定された秒数だけデータは保持されます。

 キャッシュ有効期限の起点は、CacheExpirationPolicyプロパティで指定できます。デフォルトのAbsolute(絶対)の場合は、キャッシュが最初に作成された時点から有効期限をカウントしますが、Sliding(相対)の場合は、キャッシュが最後にアクセスされた時点から有効期限をカウントします。

 出版社情報がほとんど更新されないデータであるという場合には、そもそもデータ取得モードとしてDataReaderを利用するよりも、SqlDataSourceコントロールのキャッシュ機能の利用を検討してもよいでしょう。キャッシュ機能を利用することで、データベースへのアクセス頻度を減らすことができますので、パフォーマンスの向上が期待できます。

[3]GridViewコントロール上のSqlDataSourceコントロールを編集する

 最後に、[1][2]で作成したDropDownListコントロールの選択値をGridViewコントロールのフィルタ条件として引き渡すための設定を行う必要があります。

 [GridViewタスク]メニューから[データソースの構成]を選択すると、[データソースの構成]ウィザードが起動します。[Selectステートメントの構成]ダイアログに移動したうえで、[WHERE]ボタンをクリックしてください(連載第2回の図6の画面 )。

 [WHERE句の追加]ダイアログが表示されますので、以下の図5の要領で絞り込み条件を指定したうえで[追加]ボタンをクリックします。これでpublish列がDropDownListコントロール(lstPub)の選択値(SelectedValueプロパティ)と等しいデータだけが抽出されることになります。


図5 [WHERE句の追加]ダイアログ
SqlDataSourceコントロールで設定されるSelectステートメントのWHERE句を設定する。ここではpublish列の値がDropDownListコントロール(コントロールIDは「lstPub」)で選択された値と等しいものというWHERE句を設定している。これより、GridViewコントロールで一覧表示するデータが絞り込まれる。

 ちなみに、SqlDataSourceコントロールのパラメータとして指定できるのは、フォーム上に配置したサーバ・コントロールの値だけではありません。ポスト・データ、クエリ情報、クッキー、セッション情報などの値をパラメータにバインドすることも可能です。

 例えば、クエリ情報「publish」によって同様の絞り込みを行いたいという場合には、[WHERE句の追加]ダイアログで以下のように指定してください。既定値には、指定されたパラメータが空である場合に適用するデフォルトの値を指定します。


図6 [WHERE句の追加]ダイアログ
クエリ情報「publish」によってpublish列を絞り込む場合のWHERE句の設定。この設定では「http://<ページのURL>?publish=<パラメータ>」の形式でパラメータを渡すことができる。

 以上の手順を終えたら、サンプルを実行してみましょう。先の図3のようにプルダウン・メニューの選択値に応じてグリッドの表示が変更されれば成功です。

 以上、今回もGridView/SqlDataSourceコントロールを使って、グリッド表の整形やデータの絞り込みについて紹介してみました。Visual Studio 2005では、ごく単純なデータの取得/更新ばかりではなく、アプリケーション固有の要件に応じたカスタマイズまでもが(コーディングすることなく)プロパティの設定のみで実現できることがお分かりいただけたことと思います。

 次回は、引き続きGridView/SqlDataSourceコントロールを利用したデータの更新や単票データを表現するためのDetailsViewコントロールなどを扱う予定です。どうぞお楽しみに。End of Article


 INDEX
  Visual Studio 2005でいってみようDBプログラミング
  第3回 データアクセス/データソース・コントロールを使い倒せ!
    1.GridViewコントロールの表示列をカスタマイズする
    2.GridViewカスタマイズのポイント
  3.グリッド表の内容をプルダウン・メニューで絞り込む
 
インデックス・ページヘ  「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 記事ランキング

本日 月間