列表和组合框可以包含对象而不仅仅是字符串。您可以设置一个List(Of T)
(除其他外)作为DataSource
。这允许您显示一项内容,但获取不同的内容,例如返回值。
这非常有用,有一个简单的方法并不罕见NameValuePair
类将值或代码转换为用户友好的内容:
Public Class NVP
Public Property Name As String
Public Property Value As Integer
Public Sub New(n As String, v As Integer)
Name = n
Value = v
End Sub
' what these will display using .ToString:
Public Overrides Function ToString() As String
Return String.Format("{0} ({1})", Name, Value.ToString)
End Function
End Class
然后是创建这些列表并将其用作组合源的代码:
Private myAList As List(Of NVP)
...
myAList = New List(Of NVP)
myAList.Add(New NVP("ziggy", 26))
myAList.Add(New NVP("able", 1))
myAList.Add(New NVP("charlie", 3))
myAList.Add(New NVP("echo", 5))
ComboBox1.DataSource = myAList
ComboBox1.DisplayMember = "Name" ' property name to show the user
ComboBox1.ValueMember = "Value" ' property name to use as the value
然后,使用它:
Console.WriteLine("Selection Changed! Item: {0} Value: {1}",
ComboBox1.SelectedItem.ToString,
ComboBox1.SelectedValue.ToString)
Output:
选择已更改!物品:之字形 (26) 价值:26
选择已更改!物品:查理 (3) 价值:3
选择已更改!项目:能够 (1) 价值:1
Notes:
NameValuePair 类的好处是它将数据保存在一起(并且易于访问),而不是作为不同数组中的单独项目。
使用的主要好处DataSource
,就是您不需要复制数据。而不是复制Name
值从列表到Items
集合,List/ComboBox
使用相同的你的代码就是这样做的。
SelectedItem
返回一个NVP
对象(就像.Items(n)
)但它们返回为Object
所以你需要将其投射回NameValuePair
访问任何属性:
thisItem = CType(ComboBox1.SelectedItem, NVP)
Console.WriteLine(thisItem.Name)
SelectedItem.ToString
调用ToString
我们的 Type 上的方法。它可能只是打印Name
或者任何你想要的。
If the list是动态的 - 事物被添加和/或从中删除 - 那么你可能会想要使用BiningList(of T)
反而。更改为list将自动出现在控件中(ListBox
, ComboBox
, DatagridView
).
如果列表items是动态的 - {"ziggy", 26} 可能会更改为 {"zulu", 98},那么你的项目类应该实现INotifyPropertyChanged
因此这些更改也会自动显示在 UI 控件中。