因此,我有一个列表框,该列表框由ID(键)和Name(值)限定。这是我用来将字典绑定到列表框的方法:
listCustomer.DataSource = Nothing
listCustomer.Items.Clear()
Dim listCustomerSource As New Dictionary(Of String, String)()
While (dr.Read())
listCustomerSource.Add(dr.GetString(0), dr.GetString(1))
End While
listCustomer.DataSource = New BindingSource(listCustomerSource, Nothing)
listCustomer.DisplayMember = "Value"
listCustomer.ValueMember = "Key"
这是我在textbox_textchange中使用的方法:
Private Sub searchList(ByVal textbox As TextBox, ByVal listbox As ListBox)
Dim hits = From item In listbox.Items.Cast(Of String)() Where (item.IndexOf(textbox.Text, StringComparison.OrdinalIgnoreCase) >= 0)
If hits.Any Then
listbox.SelectedItem = hits.First()
Else
listbox.ClearSelected()
End If
End Sub
我已经在仅带有文本(未绑定)的列表框中尝试了它,并且效果很好,但是如果我在带有受限字典的列表框中使用它,则会收到错误消息“无法转换类型为System.Collections的对象” .Generic.KeyValuePair`2 [System.String,System.String]'键入“ System.String”。在文本框中输入
答案 0 :(得分:1)
之所以会发生这种情况,是因为绑定数据源时,项不再是简单的字符串,而是数据源的实例。当您绑定字典时,列表框中的每个项目都是KeyValuePair类的实例。在DisplayMember或ValueMember上设置的值仅由ListBox用于显示目的,您的项目都是 KeyValuePair(Of String,String)
因此,您只需将搜索匹配项的行更改为
Dim hits = From item In l.Items.Cast(Of KeyValuePair(Of String, String))()
Where (item.Value.IndexOf(x, StringComparison.OrdinalIgnoreCase) >= 0)