この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.3 顧客の一覧参照
●データグリッドとADODB.Recordsetオブジェクトとを結び付ける
 データグリッドに列の設定を終えたところで,データグリッドにADODB.Recordsetオブジェクトを結び付ける方法について説明する。

 本節の最初でも説明したように,データグリッドのDataSourceプロパティにADODB.Recordsetオブジェクトを結び付けると,データグリッドはそのADODB.Recordsetオブジェクトの内容を表示するようになる。具体的には,Business.CustomerコンポーネントのGetCustomersメソッドを呼び出して取得したADODB.Recordsetオブジェクトを,データグリッドのDataSourceプロパティに設定すればよい。そのような処理をするRefreshDataという名前のプロシージャを実装するとすると,List 7-12のようになる。

 List 7-12では,11行目でBusiness.Customerコンポーネントを実体化し,12行目で顧客の一覧を含むADODB.Recordsetオブジェクトを取得している。12行目で取得したADODB.Recordsetオブジェクトは,1行目で宣言してあるグローバル変数g_objRecに格納することにした。グローバル変数にした理由は,あとから実装する処理部分で,取得したADODB.Recordsetオブジェクトを使うつもりだからである。

 14行目では,取得したADODB.RecordsetオブジェクトをDGrid_CustomerデータグリッドのDataSourceプロパティに設定している。これにより,DGrid_CustomerデータグリッドとBusiness.CustomerコンポーネントのGetCustomersメソッドの呼び出しで得たADODB.Recordsetオブジェクトとが結び付き,DGrid_CustomerデータグリッドはそのADODB.Recordsetオブジェクトが保持するレコードの内容を表示することになる。

 16行目にあるRefreshメソッドの呼び出しは,データグリッドを再描画するためのものである。これにより,データグリッドが表示している内容が更新され,新しく設定されたADODB.Recordsetオブジェクトが保持するレコードの内容を表示するようになる。

 あとは,フォームがロードされたときに自動的にADODB.Recordsetオブジェクトと結び付けるために,List 7-12で示したRefreshDataプロシージャを呼び出すだけである。そのためには,すでにList 7-6で示したFormCustomerフォームのForm_Loadプロシージャの最後にRefreshDataプロシージャの呼び出しを追加すればよい(List 7-13)。

 List 7-13の処理を施すと,アプリケーションを実行したとき,データグリッドのなかに顧客情報が表示されることを確認できると思う(Fig.7-29)。

Fig.7-29 データグリッドのなかに表示された顧客一覧
fig7_29

 ここでデータグリッドの概要について説明しておく。

 改めていうこともないが,データグリッドは結び付けられたADODB.Recordsetオブジェクトが保持するレコードの内容を表形式で表示するものである。このとき,表示されるレコードの順序は,ADODB.Recordsetオブジェクトに格納されているレコードの順序と同じ順序になる。つまり,データグリッドの一番上に表示されている行はADODB.Recordsetオブジェクトの第1行目,二番目に表示されている行はADODB.Recordsetオブジェクトの第2行目,……という具合に順に対応する。

 データグリッドの左側には,カレント行の位置を示す三角の印が付いている。この印のことを「マーキー」と呼ぶ。マーキーが指す行は,ADODB.Recordsetオブジェクトにおけるカレント行(カレントレコード)でもある。ユーザーは,カーソルの上下キーを押すことによって,マーキーが指す行を上下に移動することができる。マーキーの移動に伴い,ADODB.Recordsetオブジェクトのカレント行も移動する。逆にADODB.RecordsetオブジェクトのMoveNextメソッドやMovePrevメソッド,MoveFirstメソッド,MoveLastメソッドなどを呼び出してカレント行の位置を変更した場合,データグリッドにおけるマーキーの位置も変更される(カレント行が画面外になったときには,カレント行が画面内に入るよう自動的にスクロール処理される)。

 マーキーが指す位置は,データグリッドのBookMarkプロパティに保存されている。BookMarkプロパティに保存される値のことを「ブックマーク」と呼ぶ。ブックマークとは,行の位置を一意に示すVariant型の値である。たとえば,ある時点でBookMarkプロパティの値を何らかの変数に保存しておき,あとでまたBookMarkプロパティに戻すといった処理をしたとする。この場合,特定の位置を保存しておき,あとでその保存しておいた位置をカレント行に戻したことになる(その方法はすぐあとで説明する)。


One Point! マーキーは,データグリッドのMarqueeStyleプロパティによって,表示スタイルを変更したり非表示したりすることができる。また,マーキーを表示していなくても,BookMarkプロパティを利用することはできる。

 なお,今回は,読み取り専用のADODB.Recordsetオブジェクトを結び付けているため,データグリッド上でユーザーが編集することはできないが(前章においてBusiness.Customerコンポーネントが戻り値とするADODB.Recordsetオブジェクトは読み取り専用とするように実装したことを思い出してほしい),書き込み可能なADODB.Recordsetオブジェクトを結び付ければ,データグリッド上で編集させることもできる。


One Point! データグリッドを使ってできる編集操作は,AllowAddNewプロパティ(新しい行の追加が可能),AllowDeleteプロパティ(行の削除が可能),AllowUpdateプロパティ(行の編集が可能)によって,操作を許可したり(Trueに設定)不許可にしたり(Falseに設定)することもできる。

 Fig.7-29を見るとわかるように,一番上の行にはデータグリッドのプロパティの[列]ページ(Fig.7-26)で設定したキャプションが表示されている。このキャプションのことを「列見出し」と呼ぶ。


One Point! 列見出しは,データグリッドのHeadLinesプロパティを変更することによって,非表示にしたり複数行に設定したりすることもできる。

 データグリッドにおける各列は,Columnオブジェクトとして構成される。そして全列はColumnsコレクションとして構成される。Columnsコレクションは,列の左から順にColumnオブジェクトを指すコレクションである。たとえば,Fig.7-29の場合,Columns(0)は,顧客番号の列を示すColumnオブジェクトを指し,Column(1)はよみがなの列を示すColumnオブジェクトを指し,Column(8)は締め日の列を示すColumnオブジェクトを指す,といった具合である。

 データグリッドに割り当てられている列の総数は,ColumnsコレクションのCountプロパティに格納される。Fig.7-29を見ると全部で9つの列があるため,ColumnsコレクションのCountプロパティの値は9であるように思えるが,実際にはそうではない。ColumnsコレクションのCountプロパティは,非表示である列も含めた値である。Fig.7-29では,9列しか表示されていないが,実際には,そのうしろに「作成者」「作成日」「最終更新者」「最終更新日」「削除ずみ」の列が続く(Table 7-6を参照)。これらの列は,Fig.7-28において[Visible]にチェックを付けないために非表示になっているだけで,実際に列がないわけではない。つまり,ColumnsコレクションのCountプロパティの値は登録したすべての列の総数である13を保持する。もちろん,非表示の列にアクセスすることもできる。実際,Columns(9)は作成者の列を示すColumnオブジェクトを指し,Columns(10)は作成日の列を示すColumnオブジェクトを指す,ということになる。

 列の値を取得するには,ColumnオブジェクトのTextプロパティまたはValueプロパティを使う。Textプロパティは画面に表示されているテキストを返し,Valueプロパティは値そのものを返す。違いがわかりにくいかもしれないが,TextプロパティではValueプロパティの値が特定の書式に置き換えられた文字列(書式はデータグリッドのプロパティの[形式]ページで設定できる)を返すのに対し,Valueプロパティは値そのもの――つまり,結び付けられたADODB.Recordsetオブジェクトのフィールド値と同じもの――を返すという違いがある。書式を特に設定していなければ,両者の値はほぼ同じになる(ほぼというのは,Textプロパティは文字列として返すのに対し,Valueプロパティは値として返すため,型の違いが発生するからである)。

 TextプロパティもValueプロパティも,カレント行(マーキーがある行)の値を返す。たとえば,Fig.7-29の状態であれば1行目にマーキーがあるため,Columns(5).Textは,“03-1234-5678”を返し,Columns(8).Textは“30”を返すことになる。


One Point! データグリッドに表示されている,カレント行以外の任意の行の値を簡単に取得する方法は用意されていない。そもそも,データグリッドにおいては,行の数は不定であり,何行保持しているのかを取得する方法すらない(画面内に何行分表示されているのかはVisibleRowsプロパティで取得することができる)。よって,行の数を取得するには,データグリッドに結び付けられたADODB.RecordsetオブジェクトのRecordCountプロパティを使い,ADODB.Recordsetオブジェクト自身にいくつのレコードが含まれているのかを調べるしか方法がない。また,任意の行の値を取得するには,ColumnオブジェクトのCellTextプロパティとCellValueプロパティを使うことができる。しかし,CellTextプロパティとCellValueプロパティは,ともに特定のブックマークから何行分か離れた行の値を取得するものであり,ブックマークを最初に取得しないと使うことができない。単純な表のように,「何行目の何列目の値を取得する」といった方法は用意されていないのである。
Prev 17/134 Next