Для поля со списком 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
Другие вопросы по тегам