vb.net列表框搜索

时间:2012-07-10 17:28:41

标签: vb.net search listbox

我正在尝试将TextBox1设为搜索栏,以便在ListBox1中搜索特定字符串。

我希望它删除没有我搜索过的字符串的其他项目。例如,如果列表包含(奶酪,鸡蛋,牛奶,鸡肉,巧克力),那么搜索“ch”只会显示奶酪,鸡肉和巧克力。这可能吗?

我这里的代码搜索字符串,但不会消除其他代码。

编辑: - 这些都是非常好的回复,但我不能使用它们中的任何一个,因为列表框是由特定目录中的文件名填充的,这给了我这个错误;

  

设置DataSource属性时无法修改项集合。

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    Dim i As Integer = ListBox1.FindString(TextBox1.Text)
    ListBox1.SelectedIndex = i
    If TextBox1.Text = "" Then
        ListBox1.SelectedIndex = -1
    End If
End Sub

我感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:2)

要以这种方式进行工作,您需要在内存中列出所有项目,然后ListBox1仅显示匹配项。否则,当用户点击退格键以缩短其搜索短语时,原始项目都不会返回。因此,在TextBox1_TextChanged事件中,最简单的方法是清除ListBox1,然后遍历内存中的所有项目,然后只添加与ListBox1匹配的项目。例如:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    ListBox1.Items.Clear()
    For Each item As String In allItems
        If item.StartsWith(TextBox1.Text, StringComparison.CurrentCultureIgnoreCase) Then
            ListBox1.Items.Add(item)
        End If
    Next
End Sub

在此示例中,allItems是所有项目的内存列表。如果您的项目是字符串,就像它们所显示的那样,那么我建议您将它设为List(Of String)并在类/表单级别将其声明为私有字段:

private allItems As New List(Of String)()

然后,您需要在某个地方填写列表,可能是表格的Load事件:

allItems.Add("cheese")
allItems.Add("eggs")
allItems.Add("milk")
allItems.Add("chicken")
allItems.Add("chocolate")

但是,如果您只需要一个自动完成的文本框,重新发明轮子是愚蠢的。 WinForm TextBox控件本身支持此功能及其AutoComplete属性。

答案 1 :(得分:1)

    Dim lstBindTheseStrings As List(Of Object) = (From objString As Object _
                                                  In ListBox1.Items _
                                                  Where CStr(objString).StartsWith(TextBox1.Text)).ToList()

    ListBox1.DataSource = lstBindTheseStrings

    ListBox1.SelectedIndex = If((ListBox1.FindString(TextBox1.Text) > -1), _
                                 ListBox1.FindString(TextBox1.Text), -1)

编辑:

上面的代码将最初在ListBox中过滤掉什么。 SteveDog的解决方案更多是您正在寻找的解决方案,但您可以使用AllItems列表替换我的Linq语句中的ListBox1.Items,以达到您想要的位置。

答案 2 :(得分:0)

SteveDog的解决方案是您想要的方式,因此您不必在每次搜索后继续重新填充列表框。但是,如果您设置在该路径上......

    Dim i As Integer
    For i = 0 To ListBox1.Items.Count - 1
        If i > ListBox1.Items.Count - 1 Then Exit For
        If Not ListBox1.Items(i).Contains(Textbox1.Text) Then
            ListBox1.Items.Remove(ListBox1.Items(i))
            i -= 1
        End If
    Next

虽然看起来很乱,不是吗?