投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/3/15 14:16:37
ComboBox に対するデータバインドには、大きく分けて 2 種類あります。

「ドロップダウンリストに表示する一覧」のためのバインドと、
「一覧の中のどのアイテムを選択しているか」のためのバインドです。


説明のため、新規プロジェクトにて以下を作ってみてください。

(1) プロジェクトに DataSet クラスを "MyDataSet" という名で追加し、それを開いて
 DataSet デザイナーでテーブルを追加。テーブル名は "MyDataTable" にしておく。

(2) そのテーブルに 列を 2 つ追加する。列名は "DataColumn1"、"DataColumn2" のままとし、
 DataColumn1 列を右クリックして「主キーの設定」を選択して 🔑 マークをつけておく。

(3) プロジェクトをビルドする。ツールボックスに (1) の型付 DataSet が追加される。

(4) ツールボックスに現れた MyDataSet をフォームに貼る。名前は "MyDataSet1" のまま。

(5) 続けて、ComboBox、BindingSource、BindingNavigator もフォームに貼る。

(6) BindingSource1 を選択し、その DataSource プロパティから
 [他のデータ ソース] - [Form1 一覧インスタンス] - [MyDataSet1] を選択。

(7) さらに続けて、BindingSource1 の DataMember プロパティに MyDataTable を指定する。

(8) BindingNavigator1 を選択し、BindingSource プロパティに BindingSource1 を指定。

(9) ComboBox1 を選択し、DataSource プロパティに BindingSource1 を指定。

(10) さらに続けて、ComboBox1 の DisplayMember プロパティに DataColumn2 列を、
 ValueMember プロパティには、主キー設定した DataColumn1 列を指定する。

(11) Form1 の Load イベントに下記を記述して実行。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.MyDataSet1.MyDataTable.AddMyDataTableRow("11""aaa")
    Me.MyDataSet1.MyDataTable.AddMyDataTableRow("12""bbb")
    Me.MyDataSet1.MyDataTable.AddMyDataTableRow("13""ccc")
    Me.MyDataSet1.MyDataTable.AddMyDataTableRow("14""ddd")
End Sub


(12) ComboBox1 のドロップダウンリストに、aaa, bbb, ccc, ddd が表示されることと、
 BindingNavigator1 の現在行が、その選択内容と連動していることを確認する。



> ComboBoxのDropDownStyleをDropDownに設定し値を変更した時に、
> 連動して自動的にDataTableの値も更新されると期待したのですがそうはならないようです。

ここでいう「値を変更した」というのは、どのような操作のことでしょうか。

たとえば下記のようにすれば、上記サンプルの "ccc" が "NewText" に書き換わるはずです。
ComboBox1 と MyDataSet1 の両方の内容が連動して編集されるはず。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.MyDataSet1.MyDataTable(2).DataColumn2 = "NewText"
End Sub


上記では DataTable 側を書き換えていますが、もちろん ComboBox 側から書き換えることもできます。
下記では「現在選択されているアイテム」の文字列を書き換えています。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim rowView = TryCast(ComboBox1.SelectedItem, DataRowView)
    If rowView IsNot Nothing Then
        Dim row = DirectCast(rowView.Row, MyDataSet.MyDataTableRow)
        rowView.BeginEdit()
        row.DataColumn2 = "内容の変更"
        rowView.EndEdit()
    End If
End Sub


型付DataSet である必要はありません。実行時バインドでも構いません。
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    If ComboBox1.SelectedIndex <> -1 Then
        ComboBox1.SelectedItem("DataColumn2") = "レイトバインドで変更"
        ComboBox1.SelectedItem.EndEdit()
    End If
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    If BindingSource1.Position <> -1 Then
        BindingSource1.Current("DataColumn2") = "BindingSource側から編集"
        BindingSource1.EndEdit()
    End If
End Sub