投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/23 01:01:52
2002~2003 年当時であれば、ADO から ADO.NET への移行(マイグレーション)のための資料も
それなりにあったのですが、今見たら、既に失われている資料も多いですね…。
http://uno036.starfree.jp/PRGmanual/vbnet_migration/ado.html

とはいえ、現在お使いの VB2005 にも、ADO からの移行のための資料は記載されていたと
思いますので探してみてください。

あるいは、ADO 時代の知識は捨てて、一から ADO.NET について学び直しても良いかも知れません。
日本語である事にこだわらなければ、YouTube での動画解説も幾つかアップされていました。


> 実は、DataGridViewのフォームとは別に、レコードの追加・編集用フォームを設けたいのです。

こういう場合は、『DataGridViewのフォーム』と『レコードの追加・編集用フォーム』とで、
同一の DataSet インスタンスを使うようにします。
http://blogs.wankuma.com/hatsune/archive/2006/11/28/47367.aspx
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13532&forum=7

つまり、それぞれのフォームにおいて、Load イベント菜緒で
 Me.MyDataSet = あらかじめ取得済みのデータセットインスタンス
 Me.BindingSource1.DataSource = Me.MyDataSet
 Me.BindingSource1.DataMember = テーブル名
 Me.DataGridView1.DataSource = Me.BindingSource1
のようにしておきます。
※ DataSet インスタンスをセットするところ以外は、デザイン時に済ませておいても OK。

各画面で同じ DataSet を共有していれば、一方の画面で編集/追加/削除した行が、
即時にもう一方の画面にも反映されるので、データ転送の手間が省けます。


> そのためにRelationやForeingKeyConstraintのRemoveをしたりして
> 再度"クエリ1"を生成する方法をとりました。

こういう場合には、自前で DataSet を組み上げるのではなく、「型付き DataSet」を使うようにすると、
デザイナ画面からの割り当てが可能になるため、コーディングの手間を削減できます。

型付き DataSet の作成・設定方法はこちらをご覧ください。
前回行った主キー設定やリレーションの設定も、デザイン時に行っておくことができます。
https://masagoroku.com/%E3%80%90vb-net%E3%80%91%E5%9E%8B%E4%BB%98%E3%81%8D%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95


今回はクロス集計があるため、型付 DataSet だけでは対処しきれない点も
あるかもしれませんが、その場合は前回同様、動的に列や表を追加するスタイルとも併用できます。

この「型付 DataSet」にはテーブル定義に加え、データベースから
データを取得(あるいは削除・更新・追加)するための「TableAdapter」を
追加することもできます。(今は「Recordset + DataAdapter」を使っているのでしょうけれども)



フォーム作成の件に話を戻すと……。


(1) データ一覧用フォーム

プロジェクトに型付 DataSet がある場合、Visual Studio の
[データ ソース]ペインから該当テーブルを Form にドロップすることで、
フォームへの DataGridView の配置と、DataSource プロパティ等へのバインド作業が完了します。

この場合、フォームに配置されるのは DataGridView のインスタンスだけではなく、
DataSet & BindingSource & BindingNavigator のインスタンスも自動配置されます。


BindingNavigator の役目については、見ればすぐに分かると思いますが、
「別のレコードへの移動」「新規レコードの追加」「レコードの削除」などを
ひとまとめのボタン群に束ねたものです。

BindingSource コンポーネントは、「コントロール」と「DataSet」の間を取り持つ中継役として働きます。
そして BindingNavigator.DataSource や DataGridView.DataSource は
DataSet を直接参照するのではなく、この BindingSource を参照しています。
どうして、BindingSource 経由で参照されているのかというと、これには 2 つの理由が
あるのですが、ここでは説明を省きます。


(2) データ編集用フォーム

[データ ソース]ペインにあるアイテムを Form にドロップする際に、
テーブルそのものではなく、テーブル内の各列をフォームにドロップすると、
レコード編集画面用のデザインパーツが配置されます。
https://docs.microsoft.com/ja-jp/visualstudio/data-tools/add-new-data-sources?view=vs-2019



DataGridView の時は、DataSource プロパティを通じてバインドされていましたが、
此方の場合は、「TextBox1.DataBindings.Add("Text", データソース, …)」などの設定が行われます。
(デザイナを用いず、自前で .DataBindings.Add してももちろん OK)

ドロップで配置されるコントロールは TextBox だけでなく、各列のデータ型に合わせて、
Label/ComboBox/ListBox/NumericUpDown/DateTimePicker 等、他のコントロールにもできます。
使用可能なコントロールの種類を増やしたい場合は、オプション設定画面の
[データ UI カスタマイズ]から設定しておくことができます。
https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/options-windows-forms-designer-data-ui-customization



もし、コントロールを配置した後で、バインド設定を修正したい場合には、
デザイン画面でそのコントロールを選択し、プロパティ一覧から
"(DataBindings)" - "(詳細)" 欄から [...] を選択して、
「フォーマットと詳細バインド」画面から変更します。
これにより、先の .DataBindings.Add の自動生成コードが変更されます。
https://www.atmarkit.co.jp/fdotnet/chushin/introwinform_06/introwinform_06_02.html



あるいは先の 簡易課税 ⇔ 1 の相互変換や、イベント処理などの都合から、
あえてデータバインドは使わずに、該当行のデータを読み取って、
 TextBox1.Text = 現在行のデータ
とか、
 Combox1.SelectedIndex = 該当番号
などのコードを、一つ一つ書いて表示させる方法もあるでしょう。この辺は要件次第。

ただしデータバインドを用いなかった場合、コントロールで編集した結果を、
もう一度 DataTable に書き戻すためのコードも書く必要がありますね。


DataTable の内容が、更新あるいは削除された後は、
OleDbDataAdapter (あるいは TableAdapter)の Update メソッドに対して
編集した DataSet を渡してやれば、その内容がデータベースに反映されます。