2

我正在尝试制作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

我很感激任何帮助。谢谢。

4

3 回答 3

4

为了以这种方式工作,您需要一个列表来存储所有项目,然后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)设为 a 并在类/表单级别将其声明为私有字段:

private allItems As New List(Of String)()

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

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

但是,如果您只需要一个自动完成的文本框,那么重新发明轮子就很愚蠢。WinFormTextBox控件通过其AutoComplete属性固有地支持此功能。

于 2012-07-10T17:54:12.827 回答
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)

编辑:

上面的代码将过滤列表框中最初的内容。SteveDog 的解决方案更符合您的需求,但您可以将我的 Linq 语句中的 ListBox1.Items 替换为您的 AllItems 列表,以到达您想要的位置。

于 2012-07-10T17:54:46.920 回答
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

不过看起来很乱,不是吗?

于 2012-07-10T18:02:19.883 回答