2012-07-10 80 views
0

我試圖使TextBox1成爲一個搜索欄,以搜索ListBox1中的特定字符串。vb.net listbox search

我希望它刪除沒有我搜索的字符串的其他項目。例如,如果列表包含(奶酪,雞蛋,牛奶,雞肉,巧克力),那麼搜索「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 

我感謝所有幫助。謝謝。

回答

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固有支持此功能。

+0

感謝您的回覆,但在此行代碼中, For Each item As String In allItems allItems is not declared? – 2012-07-10 18:33:48

+0

@MattLevesque我更新了我的答案以解釋所有項目。 – 2012-07-10 18:46:37

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的解決方案更多的是你正在尋找的東西,但是你可以用你的AllItems列表來替換我的Linq語句中的ListBox1.Items以達到你想要的位置。

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 

雖然似乎很麻煩,不是嗎?

相關問題