我想从词典源填充组合框。这个字典有一个类值,我想使用组合属性值的类属性。
示例类
Public Class Customer
Public ID As Integer
Public Name As String
Public Address As String
Public City As String
Public Sub New(ByVal newID As Integer, ByVal newName As String, ByVal newAddress As String, ByVal newCity As String)
ID = newID
Name = newName
Address = newAddress
City = newCity
End Sub
End Class
示例表格
Public Class Form1
Dim Customers As New Dictionary(Of Integer, Customer)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Customers.Add(341, New Customer(341, "Michael", "Street 52", "New York"))
Customers.Add(149, New Customer(149, "Susan", "Street 12", "Los Angelos"))
Customers.Add(721, New Customer(721, "Bill", "Street 98", "Houston"))
Customers.Add(958, New Customer(958, "Jeff", "Street 54", "Washington"))
ComboBox1.DataSource = Customers 'What to use as a datasource??
ComboBox1.DisplayMember = "Name"
ComboBox1.ValueMember = "ID"
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
MsgBox(ComboBox1.SelectedValue)
End Sub
End Class
如何设置ComboBox1属性,以便我可以将客户名称视为DisplayMember
,并将其ID标识为ValueMember
?
答案 0 :(得分:2)
绑定到Dictionary
时,事情变得有点......'间接'。
与List(Of T)
不同,字典没有用作DataSource
所需的接口。为此,您需要使用BindingSource
。
' NVP is a NameValuePair class I had on hand
Private NamedPairs As New Dictionary(Of Integer, NVP)
...
NamedPairs.Add(341, New NVP("Michael", 341))
NamedPairs.Add(149, New NVP("Susan", 149))
NamedPairs.Add(721, New NVP("Bill", 721))
NamedPairs.Add(958, New NVP("Jeff", 958))
ComboBox1.DataSource = New BindingSource(NamedPairs, Nothing)
ComboBox1.DisplayMember = "Value"
ComboBox1.ValueMember = "Key"
与列表不同,列表中有Customer
个项目,字典内部是一组KeyValuePair(Of TK, TV)
。这就是您用于DisplayMember
和ValueMember
属性的内容。
最后一步是改变你的Customer
课程以控制显示的内容。由于您无法映射到实际/特定Customer
属性,因此默认显示可能类似于WindowsApp17.Foo.Customer
。要显示更有价值的内容,您需要覆盖ToString()
:
Class Customer
...
Public Overrides Function ToString() As String
Return Name
End Function
您可以随意显示:
Return String.Format("{0} ({1})", Name, Value.ToString)
' or
Return String.Format("{0} from ({1})", FirstName, City)
Private Sub ComboBox1_SelectedIndexChanged(sender ...
Console.WriteLine("SelectedValue: {0} ", ComboBox1.SelectedValue)
End Sub
输出:
SelectedValue:721
SelectedItem
将是Object
的整个KVP,因此请将其退回:
Dim kvp As KeyValuePair(Of Int32, Customer) = CType(cbo1.SelectedItem,
KeyValuePair(Of Int32, Customer))
Dim thisCust As Customer = kvp.Value