Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト
MSDN
|MSDN ライブラリ|デベロッパー センター|ダウンロード情報|開発ツール製品|コミュニティ|ご意見・ご要望|サイトマップ
MSDN Home   MSDN Home
MSDN Home > Office ソリューション開発 > Access 開発者支援 > Access 開発者向け VB プログラミング Tips > フォーム (データシート形式) の移植

フォーム (データシート形式) の移植

最終更新日 2005 年 5 月 26 日

サンプル コードのダウンロード (access_vbtips_Form_DataSheet.exe, 118 KB)

Access では、テーブルの全レコードを表示して編集させたい場合に、データシート形式という種類のフォームを作成することが良くあります。それでは、Visual Basic .NET で同等の機能を実装するにはどのようにすればよいのでしょう。今回は、Access と同じように、Visual Basic .NET でデータシート形式のフォームを作成する方法について紹介します。

図1.Access のデータシート形式 フォームデザイナ画面 図2.Access のデータシート形式 フォームを開いた状態

Access で、データシート形式のフォームを作成するには、デザイン ビューからフォームを作成し、レコードソースとコントロールソースを指定して、既定のビューを [データシート] に設定するか、フォーム ウィザードから [データシート形式] を選択してフォームを作成します。(図1.および図2.参照)一方 Visual Basic .NET では、フォームにデータシート形式が存在しないので、普通のフォームを作成して、そこに Access のデータシート形式フォームに似せた機能を実装する必要があります。

グリッド形式フォームの作成
Visual Basic .NET には、[データ フォーム ウィザード] という機能があります。このウィザードを使うことで、Access のデータシート形式フォームに似た機能を実装したフォームを簡単に作成することができます。作成する方法は以下の通りです。

1. メニューバーにある [プロジェクト]-[Windows フォームの追加] を選択し、[新しい項目の追加] ダイアログが表示されます。
2. テンプレートで [データ フォーム ウィザード] を選択します。
3. [ファイル名] にある拡張子を除いた文字列がフォームの名前になるので、任意の名前に変更し、[開く] ボタンを押します。
4. データ フォーム ウィザード ダイアログが表示されるので、[次へ] ボタンを押します。
5. 既に作成してあるデータセットを使用する場合は、[以下のデータセットを使用] を選択し、使用するデータセットをリストボックスから選択して [次へ] ボタンを押します。
データセットを新規に用意する場合は、[作成する新しいデータセットの名前] を選択し、データセットの名前を指定してから、[次へ] ボタンを押します。
6. [新しい接続] ボタンを押し、[データリンクプロパティ] を開きます。
7. [プロバイダ]タブで、[Microsoft Jet 4.0 OLE DB Provider] を選択します。
8. [接続] タブの [1.データベース名を選択または入力します] に、利用する mdb ファイルのパスを指定します。利用する mdb にログオン情報が必要な場合には、[データベースへのログオンに必要な情報を入力します] 以下にある必要な情報を指定します。[接続のテスト] ボタンを押してから、接続の成功を確認してから [OK] ボタンを押します。
9. 使用する接続を選択してから、[次へ] ボタンを押します。
10. フォームに表示する列を選択し、[次へ] ボタンを押します。
11. [データの表示方法] で、[すべてのレコードをグリッドで表示] を選択し、[完了] ボタンを押すと、図3.のようなフォームが作成されます。

図3.Visual Basic .NETのグリッド形式フォーム フォームデザイナ画面

作成されたフォームは、図1.および図2.にある Access のデータシート形式フォームと比べて、次のような違いがあります。

・レコードの操作を行うレコードセレクタにあたる機能が無い
・レコードの更新と追加をおこなうタイミングが違う
・レコードを表示するタイミングが違う

レコードセレクタの実装方法
Access のデータシート形式フォームは、レコードセレクタを表示するようにフォームのプロパティを設定することでレコードの移動などを行うインターフェースが実装されます。一方 Visual Basic .NET のウィザードが作成するグリッド形式フォームは、レコードセレクタに該当するインターフェースは実装されません。
そこで、Label コントロールと Button コントロールを使用して、レコードセレクタと同様の機能を実装します。まず、図4.のように Label コントロールと Button コントロールをフォームに貼り付けてください。

図4.レコードセレクタに見立てた Label と Button を貼り付ける

貼り付けたコントロールの Click イベントをハンドルし、レコードの移動、追加、削除、キャンセルの処理を実装します。また、レコードの操作を行ったときに表示するカレントレコード番号を更新する処理を実装します。追加するコードは、次のリスト1 のようになります。

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
Me.BindingContext(objDataSet1, "テーブル1").CancelCurrentEdit()
Me.objDataSet1_PositionChanged()
End Sub

Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
If (Me.BindingContext(objDataSet1, "テーブル1").Count > 0) Then
Me.BindingContext(objDataSet1, "テーブル1").RemoveAt(Me.BindingContext(objDataSet1, "テーブル1").Position)
Me.objDataSet1_PositionChanged()
End If
End Sub

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Try
Me.BindingContext(objDataSet1, "テーブル1").EndCurrentEdit()
Me.BindingContext(objDataSet1, "テーブル1").AddNew()
Catch eEndEdit As System.Exception
System.Windows.Forms.MessageBox.Show(eEndEdit.Message)
End Try
Me.objDataSet1_PositionChanged()
End Sub

Private Sub btnNavFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavFirst.Click
Me.BindingContext(objDataSet1, "テーブル1").Position = 0
Me.objDataSet1_PositionChanged()
End Sub

Private Sub btnNavLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavLast.Click
Me.BindingContext(objDataSet1, "テーブル1").Position = (Me.objDataSet1.Tables("テーブル1").Rows.Count - 1)
Me.objDataSet1_PositionChanged()
End Sub

Private Sub btnNavPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavPrev.Click
Me.BindingContext(objDataSet1, "テーブル1").Position = (Me.BindingContext(objDataSet1, "テーブル1").Position - 1)
Me.objDataSet1_PositionChanged()
End Sub

Private Sub btnNavNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNavNext.Click
Me.BindingContext(objDataSet1, "テーブル1").Position = (Me.BindingContext(objDataSet1, "テーブル1").Position + 1)
Me.objDataSet1_PositionChanged()
End Sub

Private Sub objDataSet1_PositionChanged()
Me.lblNavLocation.Text = (((Me.BindingContext(objDataSet1, "テーブル1").Position + 1).ToString + " / ") _
+ Me.BindingContext(objDataSet1, "テーブル1").Count.ToString)
End Sub
リスト1

レコードを表示するタイミング
Access のデータシート形式フォームは、フォームを開いたときにレコードが表示されます。一方 Visual Basic .NET のウィザードが作成するグリッド形式フォームは、[読み込み] ボタンを押すことでレコードの値が表示されるようになっています。そこで、次のコードを実装することで Access と同じタイミングでレコードが表示されるように変更します。

Private Sub DataForm1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
Me.LoadDataSet()
Catch eLoad As System.Exception
System.Windows.Forms.MessageBox.Show(eLoad.Message)
End Try
Me.objDataSet1_PositionChanged()
End Sub
リスト2

レコードの更新と追加をおこなうタイミング
Access のデータシート形式フォームは、レコードの更新や追加は、カレントレコードが移動したときに処理されます。一方 Visual Basic .NET のウィザードが作成するグリッド形式フォームは、[更新] ボタンを押すことで変更した値や追加したレコードがデータベースへ反映されるようになっています。また、Access のデータシート形式フォームは、カレントレコードの移動方法として、レコードセレクタによる移動と、データシートのクリックによる移動の 2 つの方法があります。
それでは、まずレコードセレクタによってカレントレコードが移動したときにデータベースを更新させる機能を Visual Basic .NET のウィザードが作成するグリッド形式フォームに実装しましょう。実装する方法は、objDataSet1_PositionChanged() プロシージャに、リスト 3 のコードを追加します。(赤い文字の個所が追加コードになります)

Private Sub objDataSet1_PositionChanged()
Try
Me.UpdateDataSet()
Catch eUpdate As System.Exception
System.Windows.Forms.MessageBox.Show(eUpdate.Message)
End Try
Me.lblNavLocation.Text = (((Me.BindingContext(objDataSet1, "テーブル1").Position + 1).ToString + " / ") _
+ Me.BindingContext(objDataSet1, "テーブル1").Count.ToString)
End Sub
リスト3

次に、データグリッドのカレントレコードが移動したときにデータベースを更新させる機能を Visual Basic .NET のウィザードが作成するグリッド形式フォームに実装しましょう。実装する方法は、リスト4 のコードを追加します。

Private RowNumberOld As Integer = 0

Private Sub grdテーブル1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles grdテーブル1.CurrentCellChanged
If sender.CurrentCell.RowNumber <> RowNumberOld Then
RowNumberOld = sender.CurrentCell.RowNumber
Me.objDataSet1_PositionChanged()
End If
End Sub
リスト4

以上の変更によって、Access のデータシート形式フォームと同等の機能が実装できました。
最後に、外見について Access のフォームを参考に次のような変更を行います。(図5.参照)

1. データグリッドコントロールのプロパティを開き、CaptionVisible を False に設定します。
2. リスト1〜4.の変更により、不要となったボタンを削除します。
3. フォームのサイズと、全てのコントロールの配置を調整します。

図5.図4.のフォームを調整した Visual Basic .NET のグリッド形式 フォームデザイナ画面 図6.図5.にあるフォームの実行イメージ

「Access 変換ウィザード」で変換した場合の動作
Access のデータシート形式フォームを「Access 変換ウィザード」で変換すると、単票形式フォームを変換したときと同じ形式のフォームが作成されてしまいます。
しかし、「Access 変換ウィザード」が生成するレコードセレクタ コントロールは、外見も Access のものにとてもよく似ていて、Visual Basic .NET で新規にフォームを追加した際にも利用できてとても便利です。
そこで、「Access 変換ウィザード」が生成した単票形式のフォームをデータシート形式で表示するように修正します。
まず、フィールド名が設定されているラベルコントロールと、関連するテキストボックスを削除し、変わりにデータグリッドコントロールを貼り付けます。 貼り付けたデータグリッドコントロールのプロパティを開き、次の手順で設定を変更します。

1. CaptionVisible を False に設定します。
2. Dock を Fill に設定します。
3. DataSource を F_データシート形式DataSet1 に設定します。
4. DataMember を F_データシート形式DataSet に設定します。

上記設定では、テーブルにある全てのフィールドが表示されます。 表示するフィールドを指定した場合や、フィールド毎に幅や色を指定したい場合には、データグリッドコントロールのプロパティを開き、次の手順で設定を行います。

1. TableStyles の右にある [...] ボタンを押し、[DataGridTableStyle コレクション エディタ] を開きます。
2. [追加] ボタンを押し、DataGridTableStyle を追加します。
3. MappingName を F_データシート形式DataSet に設定します。
4. GridColumnStyles の右にある [...] ボタンを押し、[DataGridColumnStyle コレクション エディタ] を開きます。
5. [追加] ボタンを押し、DataGridTextBoxColumn を追加します。
6. MappingName に表示したいフィールド名を設定します。
7. HeaderText に列ヘッダに表示したいフィールド名称を設定します。
8. 表示位置や幅を指定したい場合には、Alignment や Width へ値を指定します。
9. 表示するフィールド分 5.〜8. の手順を繰り返します。

レコードセレクタ コントロールのコード(RecordSelector.vb)へリスト5のコードを追加し、データグリッドを貼り付けたフォームのコード(テーブル1.vb)へリスト6 のコードを追加することでデータグリッドのカレントレコードを移動したときにデータベースを更新するようにします。

Public Sub SetPositionChange(ByVal intPos As Integer)
If (intPos < 0) Or (intPos > ds.Tables(TableNameString).Rows.Count - 1) Then
Exit Sub
End If
IsNew = False
Dim nRes As Integer = 0
RaiseEvent BeforePositionChange(Me, nRes)
If nRes = 1 Then
Exit Sub
End If
If UpdateDatasetCheck() Then
MyBase.BindingContext(ds, TableNameString).Position = intPos
Call PositionChanged()
End If
End Sub
リスト5

Private RowNumberOld As Integer = 0
Private Sub DataGrid1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.CurrentCellChanged
If sender.CurrentCell.RowNumber <> RowNumberOld Then
RowNumberOld = sender.CurrentCell.RowNumber
RecordSelector1.SetPositionChange(sender.CurrentCell.RowNumber)
End If
End Sub
リスト6

以上の変更により、「Access 変換ウィザード」が生成したフォームをデータグリッド形式のフォームに変更できます。(図7.参照)

図7.「Access 変換ウィザード」が生成したレコードセレクタを利用したデータグリッド形式フォーム


Microsoft