第6回 マスタ/詳細テーブルを扱うデータベース・アプリケーション連載:Visual Studio 2005によるWindowsデータベース・プログラミング(3/4 ページ)

» 2007年10月09日 00時00分 公開
[遠藤孝信デジタルアドバンテージ]

コンボボックスによるルックアップ・テーブル・データの表示

 以上でマスタ/詳細テーブルの情報を表示するという目的は達成しましたが、図9の画面では、以下の3つの表示項目は利用者にとってあまり意味のないID値がそのまま表示されています。

  • Customer ID
  • Employee ID
  • Product ID

 当然ながら、そこには顧客名、担当社員氏名、商品名が表示されている方が便利です。また、データの新規入力時や修正時には、選択可能な項目の一覧から選べるようになっている方がよいでしょう。ということで以降では、これらの表示部分でコンボボックスにより値を選択できるようにアプリケーションを変更していきます。

■データテーブルの追加

 上記3つのID値に対応した名前は、Northwindデータベースではそれぞれ以下のテーブルに格納されています。これらのテーブルは一般的に「定数テーブル」や「ルックアップ・テーブル」と呼ばれるものです。

  • Customersテーブル(顧客マスタ)
  • Employeesテーブル(社員マスタ)
  • Productsテーブル(商品マスタ)

 ここではまず、これら3つのテーブルをデータベース・エクスプローラからデータセット・デザイナにドラッグ&ドロップして3つのデータテーブルを作成します。

 ただしテーブルをそのままドラッグ&ドロップすると余分な列まで含まれてしまうため、ここではデータベース・エクスプローラでテーブルを展開し、必要な列項目のみを[Ctrl]キーを押しながらマウス・クリックにより選択してから、データセットに追加していきます。

 例えばCustomersテーブルの場合には次のようにして行います。なお、Northwindデータベースにおいては、顧客というのは個人ではなく法人ですので、Customer IDに対応する名前はCompanyName列に格納されています。

図11 Customersデータテーブルの追加
データベース・エクスプローラでCustomersテーブルの項目を展開し、CustomerID列とCompanyName列のみを選択して、それをデータセット・デザイナにドラッグ&ドロップする。
  (1)[Ctrl]キーを押しながらマウス・クリックにより選択する。
  (2)ドラッグ&ドロップして追加する。

 同様にして、EmployeesテーブルとProductsテーブルも追加します。Employeesテーブルに関しては、社員の名前がLastName列とFirstName列に分かれて格納されているので、両方の列をデータテーブルに含めておきます(これについては後述)。

 以上により、データセット・デザイナは次のような画面になります。ここでは先ほどと同様に、データテーブルの名前を分かりやすいように日本語にしています(また手動によりデータテーブルを整列させています)。各リレーションシップはデータベースでの設定に従って自動的に設定されたものです。

図12 追加した3つのルックアップ・テーブル

 では、Customer ID表示部分のテキストボックスから置き換えていきましょう。

■顧客名コンボボックスの設定

 まずすでに配置済みのテキストボックスをフォームから削除し、次の画面のように[データソース]ウィンドウの注文テーブルの項目配下にある「CustomerID」の項目をComboBoxに変更してから、フォーム上にドラッグ&ドロップします。再度ラベルもいっしょに作成されますが、これは不要なので削除します。

図13 顧客名コンボボックスの追加
すでに作成されているテキストボックスを削除し、コンボボックスとして追加し直す。
  (1)メニューを開き「ComboBox」を選択する。
  (2)「CustomerID」の項目をドラッグ&ドロップする。

 ここで[プロパティ]ウィンドウを見ると、いま配置したコンボボックスの「(DataBindings)プロパティ」配下のTextプロパティが「注文BindingSource - CustomerID」に単純データ連結されているはずです。この設定は不要ですので、これを「なし」に設定しておきます。単純データ連結については、第5回で解説しています。

 次に、配置したコンボボックスの右上にある小さなボタンをクリックし、「ComboBoxタスク」を開き、「データバインド項目を使用する」にチェックを入れます。これによりComboBoxタスクは次のようになります。

図14 ComboBoxタスク
「データバインド項目を使用する」にチェックを入れるとデータバインド・モードの設定欄が表示される。
  (1)この小さなボタンをクリックする。
  (2)「データバインド項目を使用する」にチェックを入れる。

 そして4つの設定欄を次の表のように設定します。この表では、これらの設定により実際に設定されるコンボボックスのプロパティについても示しています。

設定欄 設定する値 実際に設定される
プロパティ
データソース [他のデータ ソース]−[プロジェクト データ ソース]−[NORTHWNDDataSet]−[顧客マスタ] DataSource
メンバの表示 CompanyName DisplayMember
値メンバ CustomerID ValueMember
選択された値 [注文BindingSource]−[CustomerID] (SelectedValueとの単純データ連結)
表 ComboBoxタスクで設定する値

 上から順に説明してきます。「データソース」はコンボボックスで一覧を表示するときに使用されるデータソースです。この設定を行った時点で、フォームの下の欄には以下の2つのコンポーネントが自動的に追加されます。

  • 顧客マスタBindingSource
  • 顧客マスタTableAdapter

 さらにフォームのLoadイベント・ハンドラには次のようなコードが追加されます。

'TODO: このコード行はデータを'NORTHWNDDataSet.顧客マスタ' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
Me.顧客マスタTableAdapter.Fill(Me.NORTHWNDDataSet.顧客マスタ)

Loadイベント・ハンドラに追加されるコード

 このようにして顧客マスタ・データテーブルに読み込まれたレコードについて、コンボボックスで表示する列を指定するのが2つ目の「メンバの表示」*1です。

*1 この表示は明らかに日本語訳が間違っています。本来ならば「表示メンバ」とするか、「DisplayMember」のままにしておくべきものでしょう。


 コンボボックスに一覧表示される各項目には、項目表示用の文字列のほかに選択項目識別のための値も必要となります。それに使用される列を指定するのが3つ目の「値メンバ」の設定です。

 以上の3つの設定によりコンボボックスをドロップダウンしたときに顧客マスタ・データテーブルにある顧客名が一覧されるようになります。しかしこれだけでは現在表示されている注文データと連動していません。現在表示中の注文データ、すなわち注文BindingSourceが示している現在のレコードとコンボボックスを連動させるのが4つ目の「選択された値」*2の設定です。

*2 この表示は「SelectedValue」がそのまま日本語に訳されてしまっています。


「選択された値」で設定した項目は、コンボボックスのSelectedValueプロパティに単純データ連結されます([プロパティ]ウィンドウを見ると「(DataBindings)プロパティ」配下のSelectedValueプロパティが設定されているが分かります)。

 これによって画面上でのレコードの移動がコンボボックスの表示に反映され、また逆に、コンボボックスでの選択(「値メンバ」の欄に設定した列の値)が注文データテーブルに反映されるようになります。

 以上を図にまとめると次のようになります。

図15 顧客名コンボボックスのデータソース設定
コンボボックスは顧客BindingSourceにデータ連結されるとともに、そのSelectedValueプロパティが注文BindingSourceの現在レコードのCustomerID列に単純データ連結されている。後者の設定により、コンボボックスの表示が注文の表示に連動する。

 これでCustomer ID表示部分に関しては設定完了です。

 ちなみにここではComboBoxタスクを使って順に設定を行っていきましたが、実はこれらの設定を一度にすべて行ってしまうすごいショートカットも用意されています。

 これは図13でコンボボックスを配置した後に、コンボボックスの上に向けて、[データソース]ウィンドウから「顧客マスタ」の項目をドラッグ&ドロップするという方法です。ただしこの方法による設定は、単純なマスタ/詳細関係の場合にはそのまま使えますが、それ以外ではいくつかの手直しが必要になることが多いようです。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。