我正在尝试将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
我感谢任何帮助。感谢。
答案 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
虽然看起来很乱,不是吗?