Share via


親テーブルと子テーブルを DataSet 上で連携し、作業ウィンドウとシートの表示を連動させる方法 VB 版

そろそろ、Tech-Ed の担当セッション ”Visual Studio 2008 を使った Office 開発の道標” に向けて、デモネタを考えないといけないのですが、出そうかなあと思っていたものに似たものが別のセッションで出たり(汗)、自分のブログでネタを書いていたり、お客様にすでに見せていたりして、正直、すべて新規で作らないといけない状況です。(笑えない。)

なので、Tech-ED までに持っているネタはすべてお見せしたいと思います。

すべて出し切って、そして、新ネタを Tech-ED で公開予定です。

これからの VSTO の可能性を実際の現場で要望のあるネタを複数用意しています。

つまり、実際の案件対応でお客様の要件に乗ってプロトタイプで作成しているデモになります。

皆様、乞うご期待!(かなり、気合いれてます!)

本編ですが、今回のネタは VS2005 が出た当時、今の部署の先輩方と SharePoint MVP の山崎愛さんが作成されたネタです。

分かりやすくて応用ができるので、いろいろな場でお見せしています。

内容的には、テーブルアダプターで2つのテーブルをデータセットに読み込んで、データセット上でリレーションを貼り、作業ウィンドウとシート上でデータ連携をさせる内容です。

レコード移動前:

image

レコード移動後:

image

という感じで、ナビゲーションバーを移動することで、リレーションが張られたシートのデータも遷移するというものです。

リレーションシップの設定:

image

この手の内容は様々なシーンで応用が可能かと思います。では、実際に手順に入りたいと思います。

手順:

1.プロジェクトを作成し、データ接続を作成します。

1.1 [ファイル]-[新しいプロジェクト]をクリックします。

clip_image002

1.2 [プロジェクトの種類] で [Visual Basic]-[Office]-[2007]を選択します。

1.3  [テンプレート]でExcelブックを選択します。

1.4 [プロジェクト名]に「SimpleDBAccess2」と入力します。

clip_image002[4]

1.5 [どのドキュメントを作成しますか?] で既に指定されている「新規ドキュメントの作成」を選択したまま、 [OK] をクリックします。

image

1.6 以上の操作で、プロジェクトファイルが作成されます。

image

1.7 [データ]メニューから[新しいデータソースの追加]をクリックします。

clip_image002[6]

1.8 データソースの種類として[データベース]を選択し、[次へ]をクリックします。

image

1.9 [新しい接続]ボタンをクリックします。

image

1.10 [接続の追加]ダイアログボックスの[データソース]にある[変更]ボタンをクリックします。

clip_image002[8]

1.11 [データソースの変更]で[Microsoft Access データベース ファイル]を選択し[OK]ボタンをクリックします。

image

1.12 [接続の追加]で[データベース ファイル名]に "Northwind.mdb" ファイルを指定します。

1.13 [テスト接続]ボタンをクリックし、テスト接続が成功することを確認します。

1.14 [OK]ボタンをクリックします。

1.15 接続文字列を確認し[次へ]をクリックします。

image

1.16 [いいえ]をクリックします。

image

1.17 既定の設定のまま[次へ]をクリックします。

image

1.18 [データベース オブジェクト]として「受注」テーブルと「受注明細」テーブルをクリックし、[終了]ボタンをクリックします。

image

1.19 データソースのテーブルを確認するために、[データソース ウィンドウ]のclip_image001(デザイナでデータセットを編集)ボタンをクリックします。

clip_image002[12]

1.20 「受注」テーブルと「受注明細」テーブル間にリレーションが作成されていることを確認します。リレーションの名前は「受注受注明細」です。この名前はclip_image001[4]にカーソルを当てると確認できます。

clip_image002[10]

2. ユーザーコントロールの追加とデータソース

次にユーザーコントロールの追加データソースの配置をおこないたいと思います。

2.1 [SimpleDBAccess2.xlsx]タブをクリックし、Excel シートの画面を表示します。

clip_image002[14]

2.2 [プロジェクト]メニューから[ユーザーコントロールの追加]をクリックします。

clip_image002[16]

2.3 [ファイル名]に「OrderData.vb」と入力し、[追加]ボタンをクリックします。

image

2.4 追加したユーザーコントロールを適当な大きさに広げておきます。

clip_image002[18]

2.5 [データソース ウィンドウ]を開きます。

2.6 「受注」テーブルを開き、「受注明細」のドロップダウンメニューから「なし」を選択します。

clip_image002[20]

2.7 続いて「受注」のドロップダウンメニューから「詳細」をクリックします。

clip_image002[22]

2.7 「受注」項目全体をユーザーコントロール上にドラッグドロップします。

NorthwindDataSet、受注BindingSource、受注TableAdapter、受注BindingNavigator、TableAdapterManagerが自動生成されます。

clip_image002[24]

2.8 ここで[デバッグ開始]をクリックします。ビルドするとツールボックスにユーザーコントロールに利用できるデータアクセスオブジェクトが表示されます。

2.9 ツールボックスの[SimpleDBAccess2コンポーネント]」にある[受注明細TableAdapter]を[OrderData.vb]のデザイン画面にドラッグドロップします。

clip_image002[26]

2.10 BindingNavigatorコントロールにカーソルをポイントし、スマートタグを開きます。

2.11 [BindingNavigatorタスク] から [項目の編集]リンクをクリックします。

clip_image002[28]

2.12 [項目コレクション エディタ]から今回は使用しない項目を削除します。
[メンバ]から以下の項目を選択し、clip_image001[6]ボタンをクリックします。
■ BindingNavigatorAddNewItem(clip_image002ボタン)
■ BindingNavigatorDeleteItem(clip_image003ボタン)
■ 受注BindingNavigatorSaveItem(clip_image004ボタン)

[OK]ボタンをクリックします。

clip_image002[30]

2.13 [ソリューション エクスプローラ]でThisworkbook.vbを右クリックし「コードの表示」をクリックします。

image

2.14 Thisworkbook.vbのコードエディタで次のようにコードを記述します。

Private OrderDataObject As OrderData

Private Sub ThisWorkbook_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

    OrderDataObject = New OrderData
    Globals.ThisWorkbook.ActionsPane.Controls.Add(OrderDataObject)

End Sub

2.15 ここで「アクションペインが起動する」ことを確認するため、プロジェクトを保存した後、[デバッグ開始]をクリックします。

この段階では、まだユーザーコントロールにはデータが読み込まれません、

確認が終わったら変更を保存せずに画面を閉じます。

image

3. ユーザーコントロールにコードを読み込むコード

次にユーザーコントロールにデータを読み込むためのコードを記述します。

3.1 [ソリューション エクスプローラ]で[OrderData.vb]を右クリックし、[コードの表示]をクリックします。

clip_image002[32]

3.2 [クラス名リスト]から(OrderDataイベント)をクリックします。

clip_image002[34]

3.3 [イベント リスト]から[Load]を選択します。

clip_image002[36]

3.4 Loadイベント プロシージャ内に次のコードを記述します。

Me.受注TableAdapter.Fill(Me.NorthwindDataSet.受注)
Me.受注明細TableAdapter1.Fill(Me.NorthwindDataSet.受注明細)

3.5 ここで再度、[デバッグ開始]をクリックします。今度はユーザーコントロールにデータが読み込まれます。

確認が終わったら、変更を保存せずに画面を閉じます。

image

4.Excel シート上との連携

今度はExcelシートデータとの連携を設定します。

4.1 [OrderData.vb]のコードエディタに次のコードを記述します。

Public ReadOnly Property Connector() As BindingSource
    Get
        Return Me.受注BindingSource
    End Get
End Property

4.2 SimpleDBAccess2.xlsxタブを開きます。

4.3 ツールボックスの[Excelコントロール]にある[ListObject]コントロールをSheet1上の任意のセルにドラックアンドドロップします。

clip_image002[38]

4.4 Thisworkbook.vbのコードを表示します。

4.5 ThisWorkbook_Startupイベントハンドラ内に次のコードを追記します。

With Globals.Sheet1.List1

' ヘッダー行をデータセットと連動させます。
    .AutoSetDataBoundColumnHeaders = True
    .ShowAutoFilter = False

' リストのデータソースをリレーションの張られたテーブルに設定します。
    .SetDataBinding(OrderDataObject.Connector, "受注受注明細")
End With

4.6 ここでデバッグし、動作を確認します。

前述の図のように動けば完了です。

サンプルを置いておきますので、ご確認ください。

SimpleDBAccess2.zip