2019年3月10日日曜日

VB DataGridView ふたつ 並べるには

VS IDE のデザイナーから、DB のテーブル一覧をふたつ並べて表示したいのですが ... 。
簡単には行きません。
大昔、さんざん悩んで何とか凌いだのですが、 今、して見ると ... ? なのですね。
忘れない様に、メモして置きましょう。


一覧表そのものをふたつ並べるのは、何の苦労もありません。
例えば、 DataSource に DB を設定して IDE お任せ で幾つでも持って来れます。
Visual Studio の自動生成のお陰ですね。

問題は、 BindingNavigator !です。
確認していないのですが、ひとつの Form で ひとつ なのか、
並存してはくれません。  きっと、 Form 単位の筈。.

でも、DataGridView の数だけ欲しい場合だってあるでしょう。
IDE には Toolbox の項目として、BindingNavigator が現れますが、
DataGridView と共に Form 上に現れる 固有名詞を冠した xxxBindingNavigator は無いのです。
そして、この汎用の BindingNavigator との違いは 保存 (Save Data) の有無と、
それの イベントハンドラー をコード内に自動生成するか否か、 です。
勿論、汎用ですから、個別の BindingSource とは結び付いておらず、値は None です。

  そうです。
  表示している一覧表のポインタを動かすだけ なのですね。
  Bind している Source ましてや 元の DB への反映 はしてはくれません。

従って、例えば、TabControl 等を使って、
ひとつの Form に複数の DataGridView を置き、それに、Navigator を添わせるには ひと捻り が必要になります。

もし、ひとつの Source に対して、複数の DataGridView が必要になれば、それも、上記の方法で可能かも知れません。
ただ、2箇所以上から変更更新を掛けられる形になりますから、不整合を生じる恐れがある点には留意して下さいね。

先ずは、前処理。
IDE から、DataGridView をひとつずつ 別 Form で 作って見ます。
この 別 Form は使いません。  自動生成コードを流用する目的です。

コードを見れば分かりますが、各々の Table に対して、TableAdapterManager はひとつの Adapter のみ有効にしていて、
別の Source に対しては Nothing を持っています。
全ての Table に対して、自動生成が終わってしまえば、何か別の Control を IDE から貼り付けると、
今度は、総合的な TableAdapterManager として機能しています。
IDE から、新たに、DataGridView を貼り付ければ、そこにある画面設計の下の TableAdapterManager の Property には、
複数の TableAdapter の存在が見て取れます。

さあ、複数の DataGridView を 目的の Form に貼り、
次に、BindingNavigator を貼りましょう。
固有名詞のない BindingNavigator (~1,2,3...) です。
保存 (Save Data) が無いので、先程、作った作業用の Form から Control そのものを コピーして 貼り付けます。
これだけでは、イベントハンドラーが無いので、 アイコン部分をクリックして、
そのコードも同じ様にコピーします。
具体的には、以下の様なコードですね。  注:このコードのみでは機能しません。 前処理(前述)必須。

    Private Sub xxxBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Handles xxxBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.xxxBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.xxxxxDataSet)
    End Sub

尚、新規行の追加や削除は、Solution によって、まちまち だと思いますので、
初期値設定等のコードの変更や、機能自体を無効化する等の検討も必須だと思います。
DB に制約は つきもの ですから。
言い換えれば、自動生成コードそのままで使えるものは少ないのでは無いでしょうか?。


0 件のコメント:

コメントを投稿