我目前正在尝试为 winform 的货币制作一个下拉框(组合框)。这是我到目前为止所拥有的:
但我注意到下拉框的数据绑定版本有一个特殊的选项。所以我想知道是否可以创建与此类似的东西,而无需对整个字符串进行比较或在数据库中创建表。
列表和组合框可以包含对象而不仅仅是字符串。您可以将
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)
输出:
选择已更改!物品:ziggy (26) 价值:26
选择已更改!物品:查理 (3) 价值:3
选择已更改!物品:能够 (1) 价值:1
备注:
NameValuePair 类的好处是它将数据保存在一起(并且易于访问),而不是作为不同数组中的单独项目。
使用
DataSource
的主要好处是您不需要复制数据。 Name
使用与您的代码相同的,而不是将列表中的
Items
值复制到
List/ComboBox
集合。
SelectedItem
返回一个
NVP
对象(与
.Items(n)
一样),但它们以
Object
返回,因此您需要将其强制转换回
NameValuePair
才能访问任何属性:
thisItem = CType(ComboBox1.SelectedItem, NVP)
Console.WriteLine(thisItem.Name)
SelectedItem.ToString
在我们的 Type 上调用
ToString
方法。它可能只是打印
Name
或您想要的任何内容。如果
list 是动态的 - 可以添加和/或从中删除内容 - 那么您可能需要使用 BiningList(of T)
来代替。对list 的更改将自动显示在控件中(
ListBox
、
ComboBox
、
DatagridView
)。如果列表
items 是动态的 - {"ziggy", 26} 可能更改为 {"zulu", 98},那么您的项目类应该实现 INotifyPropertyChanged
,以便这些更改也会自动显示在 UI 控件中。