0

他の理由で私のアプリケーションは MVVM アーキテクチャでセットアップされておらず、現時点ではセットアップできません。ここで変更する必要があるのは、データベースから取り込まれるコンボボックスだけです (これは OracleDataReader に格納されています)。このOracleDataReaderをループしてコンボボックスにプログラムでアイテムを追加するか、何らかの方法でバインドしたいと思います。

Public Sub LoadLocationCombo()
    Dim rs As OracleDataReader
    Dim dt As New DataTable()
    Dim dr As DataRow
    Dim lstItems As New ArrayList

    rs = objClsDB.LocationCombo

    dt.Load(rs)

    dt.Columns("description").AllowDBNull = True
    dt.Columns("value_id").AllowDBNull = True
    dt.Columns("description").DefaultValue = ""
    dt.Columns("value_id").DefaultValue = 0

    dr = dt.NewRow

    dr("description") = ""
    dr("value_id") = 0

    dt.Rows.InsertAt(dr, 0)

    cboLocation.ItemsSource = dt.DefaultView
    cboLocation.DisplayMemberPath = "description"
    cboLocation.SelectedValuePath = "value_id"

End Sub

それが私の現在の方法です。上部にも空白行を追加しようとしています。これにより、コンボが複数の行のように見えますが、選択された値には何も表示されず、何も表示されません。

編集: cboLocation.DisplayMemberPath と .SelectedValuePath を削除すると、コンボボックスは System.Data.Common.DataRecordInternal の束でいっぱいになります

4

1 に答える 1

2

まず、DataTable の DefaultView は DataView 型のオブジェクトを返しますが、DataView には「description」または「value_id」と呼ばれるプロパティがありません。そのため、何も選択されておらず、何も表示されていません。

いくつかのリストを作成し、データテーブルの値で埋めることができます。次に例を示します。

Dim listToFillCombo As New List(Of KeyValuePair(Of Integer, String))

For Each dr As DataRow In dt.Rows
    listToFillCombo .Add(New KeyValuePair(Of Integer, String)(CInt(dr("value_id")), dr("description").ToString))
Next

次に、comboBox バインディング

cboLocation.ItemsSource = listToFillCombo 
cboLocation.DisplayMemberPath = "Value"
cboLocation.SelectedValuePath = "Key"
于 2013-05-14T17:10:59.103 に答える