在运行时以编程方式将项目添加到组合框非常简单。 只需声明对象,然后调用
ComboBox.Items.Add(...)您要添加的每个项目。 此方法的一个缺点是,您无法为显示成员(在ComboBox项中显示的文本)和value成员(当您查询组合框的SelectedValue属性时返回的值) 指定值 。解决这个问题的简单方法是将组合框绑定到对象集合。 绑定组合框时,可以指定源(集合),显示成员的名称和值成员的名称。 您指定的名称对应于对象属性的名称。
因此,我们需要创建两个类。 一个用于组合框中的每个项目,另一个用于将它们全部组合在一起并用作数据源的通用集合类。 让我们开始吧。
在我的示例中,项目类表示状态。 每个州都有一个长名和一个短名,如印刷的街道地址中所用。 该类仅包含两个属性和一个简单的构造函数。
Public Class State
Private _ShortName As String
Public Property ShortName() As String
Get
Return _ShortName
End Get
Set(ByVal value As String)
_ShortName = value
End Set
End Property
Private _LongName As String
Public Property LongName() As String
Get
Return _LongName
End Get
Set(ByVal value As String)
_LongName = value
End Set
End Property
Public Sub New(ByVal shortName As String, ByVal longName As String)
Me.ShortName = shortName
Me.LongName = longName
End Sub
End Class
现在定义了项目类,我还需要一个收集类。
通过继承CollectionBase类,我可以访问用于添加,删除和排序对象的内置方法。
我还可以使用集合类构造函数来填充集合并对项目进行排序。
Public Class States
Inherits CollectionBase
Public Sub New()
InnerList.Add(New State("QLD", "Queensland"))
InnerList.Add(New State("NSW", "New South Wales"))
InnerList.Add(New State("VIC", "Victoria"))
InnerList.Add(New State("TAS", "Tasmania"))
InnerList.Add(New State("WA", "Western Australia"))
InnerList.Add(New State("SA", "South Australia"))
InnerList.Add(New State("NT", "Northern Territory"))
InnerList.Add(New State("ACT", "Australian Capital Territory"))
InnerList.Sort(New StatesComparer)
End Sub
Friend Class StatesComparer
Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
If TypeOf (x) Is State And TypeOf (y) Is State Then
Return DirectCast(x, State).LongName < DirectCast(y, State).LongName
Else
Throw New Exception("Object is not of type State")
End If
End Function
End Class
End Class
子类StatesComparer处理项目的排序。
由于每个项目都是自定义类,因此需要定义对项目进行排序的方法。
由于CollectionBase的Innerlist属性是一个Arraylist,因此用于定义实现IComparer接口的排序需求的类。
排序类仅向其父类Compare提供一个函数。
该函数接受两个参数-集合中的两个不同项-并根据第一个参数是否小于(出现在集合中)第二个参数,返回true或false。
现在,我有了填充和排序的项目集合,我所要做的就是将组合框绑定到它。 没关系
如果需要在组合框之前调用它,则执行此操作。
Dim comboStates As New ComboBox()
comboStates.DataSource = New States
comboStates.DisplayMember = "LongName"
comboStates.ValueMember = "ShortName"
From: https://bytes.com/topic/visual-basic-net/insights/914065-binding-combobox-custom-collection