第4回 ドラッグ&ドロップで作るWindowsデータベース・アプリケーション:連載:Visual Studio 2005によるWindowsデータベース・プログラミング(3/3 ページ)
Visual Studioではテーブル項目をフォームにD&DするだけでDBアプリが完成。自動的に配置される各部品について学ぶ。
デザイナにより自動的に配置されたコントロール/コンポーネント
ではデザイナにより自動的に配置されたコントロールやコンポーネントについて、詳しく見ていきましょう。
まずフォーム上に配置されるコントロールは、
- DGVコントロール(AuthorsDataGridView)
- BindingNavigatorコントロール(AuthorsBindingNavigator)
の2つです(カッコ内は各コントロールに自動的に設定される名前です*2)。
*2 これは実際にはインスタンスを参照するために、コードビハインド・ファイルで記述されているフィールド名であり、プログラムからは「Me.AuthorsDataGridView」などの記述により、そのインスタンスを参照できます。
GUIを持たない部品は、Visual Studioではコントロールと区別して「コンポーネント」と呼ばれます。フォームに対して配置されたコンポーネントは、フォーム・デザイナ上ではフォームの下の欄に並びます。
図9 [authors]項目のドラッグ&ドロップにより自動作成されたコンポーネント
(1)データセット
(2)BindingSourceコンポーネント
(3)BindingNavigatorコントロール
(4)テーブルアダプタ
この部分を見ると、
- データセット(PUBSDataSet)
- テーブルアダプタ(AuthorsTableAdapter)
- BindingSourceコンポーネント(AuthorsBindingSource)
の3つが追加されているのが分かります(BindingNavigatorコントロールは少し特別なようで、フォーム上にも、このフォーム下部分にも項目が表示されます)。
以上の自動作成された計5つのコントロール/コンポーネントのうち、BindingNavigatorコントロールとBindingSourceコンポーネントが今回新しく登場したコントロールです。これらについて、まずはBindingSourceコンポーネントから見ていきます。
■BindingSourceコンポーネント
BindingSourceコンポーネントは、データ連結可能なDGVコントロールなどのコントロールと、データソース(Windowsデータベース・アプリケーションでは通常はデータセット)とをデータ連結する場合の“仲介役”となるコンポーネントです。
第2回の最後でDGVコントロールを使用した際には、DGVコントロールとデータテーブルを直接、データ連結しましたが、Visual Studio 2005によるWindowsデータベース・アプリケーションでは、次の図のように、BindingSourceコンポーネントをDGVコントロールとデータセット(データテーブル)の間に配置するのが本来のモデルです。
図10 BindingSourceコンポーネントを使ったDGVコントロールとデータセットのデータ連結
DGVコントロールとデータセットを直接データ連結せずに、BindingSourceコンポーネントを仲介役として使用する。
ここで「間に配置する」というのは、具体的にはこの図10のように、DGVコントロールのデータソース(DataSourceプロパティ)にBindingSourceコンポーネントを指定し、BindingSourceコンポーネントのデータソースにデータセットを指定するという意味です。先の図6の画面でそれぞれのコントロールやコンポーネントのDataSourceプロパティを見れば、この図のように設定されているのが確認できます。
以降(および次回以降)で少しずつ解説していきますが、BindingSourceコンポーネントによりデータソースの編集、レコード間の移動(ナビゲーション)、レコードの並べ替え、フィルタ処理などを一元的に制御することができます。
■BindingNavigatorコントロール
BindingNavigatorコントロールは、BindingSourceコンポーネントを操作するためのGUIを提供するコントロールです。このコントロールは通常、BindingSourceコンポーネントとセットで使用されます(セットで使用するように設計されています)。
今回のアプリケーション(図8)を操作していると、BindingNavigatorコントロールがDGVコントロールの表示を直接制御しているようにも見えますが、BindingNavigatorコントロールと関連しているのは実はBindingSourceコンポーネントのみです*3。
これらの関係を図にまとめると次のようになります。BindingNavigatorコントロールのBindingSourceプロパティにBindingSourceコンポーネントが設定されることによって両者は関連付けられています。
図11 BindingNavigatorコントロールとBindingSourceコンポーネントの関係
DGVコントロールとBindingNavigatorコントロールは直接は関連付けられてはいないが、BindingNavigatorコントロールに対する操作はBindingSourceコンポーネントを介してDGVコントロールに反映される。
*3 実際、フォーム上からBindingNavigatorコントロールを削除しても、あるいはDGVコントロールを削除しても(DGVコントロールを削除してしまってはプログラムとして成り立ちませんが)、アプリケーションをビルドして正しく実行することができます。
BindingNavigatorコントロールは、内部的には実はたいしたことを行っていません。例えば、コントロール上のそれぞれのボタンは、BindingSourceコンポーネントで実装されている次のようなメソッドを呼び出しているだけです([データの保存]ボタンについては後述)。
- [最初に移動]ボタン − MoveFirstメソッド
- [前に戻る]ボタン − MovePreviousメソッド
- [次に移動]ボタン − MoveNextメソッド
- [最後に移動]ボタン − MoveLastメソッド
- [新規追加]ボタン − AddNewメソッド
- [削除]ボタン − RemoveCurrentメソッド
また、[現在の場所]テキストボックス(現在のレコード番号を示す値)は、BindingSourceコンポーネントのPositionプロパティにより取得/設定でき、レコードの総数はCountプロパティにより取得できます。
このPositionプロパティの存在からも分かるように、BindingSourceコンポーネントは「現在のレコード」の管理も行っています。現在のレコードは今回のようなDGVコントロールによるグリッド表示ではあまり意味がありませんが、次回で解説する次のようなフォームのプログラムを作成した場合には不可欠となります。
最後に、デザイナによりフォームに追記されるコードについても見ておきましょう。
■デザイナによりフォーム内に追加されるコード
デザイナが自動作成するコードのほとんどは、通常、コードビハインド・ファイル(Form1.Designer.vbなど)内に記述されますが、今回行った手順では若干のコードがフォームにも自動的に書き込まれます。
[データソース]ウィンドウから項目をドラッグ&ドロップしてDGVコントロールを自動作成した場合には、フォームのコードは次のようになります。2つのメソッドが追加されています。
Public Class Form1
Private Sub AuthorsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AuthorsBindingNavigatorSaveItem.Click
Me.Validate()
Me.AuthorsBindingSource.EndEdit()
Me.AuthorsTableAdapter.Update(Me.PUBSDataSet.authors)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: このコード行はデータを 'PUBSDataSet.authors' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
Me.AuthorsTableAdapter.Fill(Me.PUBSDataSet.authors)
End Sub
End Class
まず2番目のForm1_Loadメソッドでは、テーブルアダプタのFillメソッド(=前回で解説したFill,GetData()クエリ)が呼び出されています。これにより、プログラムの実行開始時にデータベースからデータテーブル(この場合にはMe.PUBSDataSet.authors)内にレコードが読み込まれ、データ連結の仕組みによりDGVコントロール上にレコードが表示されます。
すぐ上のコメント行にもあるように、例えば特定のボタンがクリックされたタイミングでレコードの読み込みと表示を行いたければ、Fillメソッドの呼び出しをそのボタンのイベント・ハンドラに移動させればよいだけです。
一方のAuthorsBindingNavigatorSaveItem_Clickメソッドは、BindingNavigatorコントロール上の[データの保存]ボタンがクリックされたときに呼び出されるイベント・ハンドラとなっています。ここには次の3行が書き込まれています。
Me.Validate()
Me.AuthorsBindingSource.EndEdit()
Me.AuthorsTableAdapter.Update(Me.PUBSDataSet.authors)
最後の行から順に見ていきます。3行目はテーブルアダプタのUpdateメソッドの呼び出しです。このメソッドについては前回では詳しく解説しませんでしたが、パラメータで指定されているデータテーブルの内容で、実際のデータベースのテーブルを更新します*4。データテーブルの内容はデータ連結によりグリッド上での編集内容が随時反映されていますので、Updateメソッド呼び出しにより、編集したデータがデータベースに保存されることになります。
2行目のEndEditメソッドは、現在編集中のグリッド上での編集を確定させるためのものです。通常はレコードを移動する*5ことにより編集は確定するのですが、レコードの編集後にレコードを移動せずに[保存]ボタンがクリックされる場合に備えて、この処理が必要となります。
残る1行目のValidateメソッドは、本来は検証(バリデーション)のためのイベントを発生させるためのものですが、ここでこのメソッドが呼び出されているのは、その副作用としてDGVコントロールでの編集を確定させ、表示を更新させるためのようです(このような副作用があるため、実際には2行目のEndEditメソッドの呼び出しがなくてもプログラムは動作するようです)。この行をコメントアウトしてしまうと、編集が確定せずにデータが正しく保存されなくなるのが分かります。
*4 テーブルアダプタが、データテーブル内の編集/追加/削除された各レコードについて、データベースに対してUpdate文、Insert文、Delete文などを発行します。
*5 DGVコントロールとBindingSourceコンポーネントがデータ連結されていると、DGVコントロール上での行の移動はBindingSourceコンポーネントでの現在のレコードの移動に反映されます。
以上、今回は[データソース]ウィンドウからドラッグ&ドロップによりDGVコントロールを配置して、Visual Studio 2005スタンダードといえるWindowsデータベース・アプリケーションを作成しました。
次回では、図12に示した詳細項目によるレコードの編集画面の作成から解説していく予定です。
Copyright© Digital Advantage Corp. All Rights Reserved.