由于其他原因我的应用程序没有使用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
答案 0 :(得分: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"