VB.Net-如何在以字典为边界的列表框中搜索?

时间:2018-06-29 08:37:04

标签: vb.net

因此,我有一个列表框,该列表框由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”。在文本框中输入

1 个答案:

答案 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)