Для поля со списком item = datarow, как указать ValueMember на один из его столбцов
Я добавляю элементы в комбинированный список следующим образом:
For each R as DataRow in MyDataTable.Rows
If R("ID") > 10 then MyCombo.Items.Add(R)
Next
И теперь мне нужно установить DisplayMember и ValueMember на столбец datarow:
MyCombo.ValueMember = R("ID")
MyCombo.DisplayMember = R("Name")
Я знаю, что не имеет смысла использовать "R", так как на данном этапе это не относится ни к чему, а просто указывает на то, что я имею в виду;-)
Документация для ValueMember гласит: "Строка, представляющая одно имя свойства значения свойства DataSource или иерархия имен свойств, разделенных точками, которая преобразуется в имя свойства конечного объекта с привязкой к данным"
Я знаю, что могу добавить строки в новую таблицу данных и установить его в DataSource, но, поскольку вы можете добавить любой объект в элементы комбинированного списка, было бы неплохо использовать строки напрямую, просто не могу понять, как сделать ссылаться на конкретный столбец в виде строки.
1 ответ
Может быть, вы не можете использовать объект строки напрямую. Я предполагаю, что для использования Valuemember вам нужно, чтобы объекты вашего элемента были помещены в коллекцию, которая реализует интерфейс ilist. В старые времена MS-Access элементы списков имели собственные свойства Display- и ValueMember, я всегда пропускал это в элементе управления.Net. Мой обходной путь - использовать этот класс, который затем можно использовать для всех ваших ComboBox:
Class oComboItems
Public items As New List(Of oDVpairs)
Class oDVpairs
Implements IComparable(Of oDVpairs)
Private myDM As String
Private myVM As Object
Sub New(DM As String, VM As Object)
myDM = DM
myVM = VM
End Sub
Public ReadOnly Property DM() As String
Get
Return myDM
End Get
End Property
Public ReadOnly Property VM() As Object
Get
Return myVM
End Get
End Property
Public Function CompareTo(other As oDVpairs) As Integer Implements IComparable(Of oDVpairs).CompareTo
Return Me.myDM.CompareTo(other.myDM)
End Function
End Class
Public Sub AddItems(DisplayMember As String, ValueMemeber As Object)
items.Add(New oDVpairs(DisplayMember, ValueMemeber))
End Sub
Public ReadOnly Property DisplayMember() As String
Get
Return "DM"
End Get
End Property
Public ReadOnly Property ValueMember() As Object
Get
Return "VM"
End Get
End Property
End Class
А теперь добавьте мои datarow (или любые другие объекты) в ComboBox:
Dim CI As New oComboItems
For Each R As DataRow In DT_U.Rows
If R("medlnr") > 10 Then
CI.AddItems(R("name"), R("ID"))
end if
Next
CI.items.Sort()
MyCombo.DataSource = CI.Items
MyCombo.DisplayMember = CI.DisplayMember
MyCombo.ValueMember = CI.ValueMember