2013-02-20 87 views
0

嗨我有一個窗體,找到,或者我應該說過濾器,使用文本框的列表框中的項目。我有一個文本框用於搜索和填充數據庫項目的列表框。現在,列表框項目包括蘋果,香蕉,漿果,腰果,檸檬,芒果,花生。如果我在文本框中輸入'b',列表框只顯示香蕉和漿果。如果我鍵入'ba',那麼列表框只顯示香蕉,但如果我輸入'be',那麼它會顯示漿果等等。我已經得到了這個工作(將代碼標記爲txtSearch事件中的註釋)。我的問題是,如何在用戶點擊退格時將列表框中的項目返回給用戶?因爲現在我在列表框中有香蕉和漿果,當我刪除在文本框中鍵入的文本時,它應該再次列出所有項目,以便如果我想搜索另一個項目,它將被再次過濾。提前致謝。vb2008通過使用文本框的列表框搜索

代碼更新

Public Class Glossary 

Private Sub Glossary_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Call List() 
    Refreshlist() 
End Sub 
Private Sub List() 
    Dim myCmd As New MySqlCommand 
    Dim myReader As MySqlDataReader 
    Dim myAdptr As New MySqlDataAdapter 
    Dim myDataTable As New DataTable 
    Call Connect() 
    With Me 
     STRSQL = "Select word from glossary" 
     Try 
      myCmd.Connection = myConn 
      myCmd.CommandText = STRSQL 
      myReader = myCmd.ExecuteReader 
      If (myReader.Read()) Then 
       myReader.Close() 
       myAdptr.SelectCommand = myCmd 
       myAdptr.Fill(myDataTable) 
       lstword.DisplayMember = "word" 
       lstword.ValueMember = "word" 
       If myDataTable.Rows.Count > 0 Then 
        For i As Integer = 0 To myDataTable.Rows.Count - 1 
         lstword.Items.Add(myDataTable.Rows(i)("word")) 
        Next 
       End If 
      End If 
      'lstword.Items.Clear() 
      'lstword.Items.AddRange(word.Where(Function(word) word.ToString().Contains(txtSearch.Text)).ToArray()) 
     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
     End Try 
     myReader = Nothing 
     myCmd = Nothing 
     myConn.Close() 
     Call Disconnect() 
    End With 
End Sub 

Dim word As List(Of Object) 
Private Sub Refreshlist() 
    lstword.Items.Clear() 
    lstword.Items.AddRange(word.Where(Function(word) word.ToString().Contains(txtSearch.Text)).ToArray()) 
End Sub 
Private Sub txtSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged 
    lstword.Items.Clear() 
    lstword.Items.AddRange(word.Where(Function(word) word.ToString().Contains(txtSearch.Text)).ToArray()) 
    Refreshlist() 
    'Call List() 
    'lstword.BeginUpdate() 

    'Try 
    ' ' keep track of the "non-searched items" ' 
    ' Dim word As New List(Of Object) 

    ' lstword.SelectedIndices.Clear() 
    ' If txtSearch.Text.Length > 0 Then 
    '  For index As Integer = 0 To lstword.Items.Count - 1 
    '   Dim item As String = lstword.Items(index).ToString() 

    '   If item.IndexOf(txtSearch.Text, StringComparison.CurrentCultureIgnoreCase) >= 0 Then 
    '    lstword.SelectedIndices.Add(index) 
    '   Else 
    '    ' this item was not searched for; we will remove it ' 
    '    word.Add(index) 
    '   End If 
    '  Next 

    '  ' go backwards to avoid problems with indices being shifted ' 
    '  For i As Integer = word.Count - 1 To 0 Step -1 
    '   Dim indexToRemove As Integer = word(i) 
    '   lstword.Items.RemoveAt(indexToRemove) 
    '  Next 
    ' End If 
    'Finally 
    ' lstword.EndUpdate() 
    'End Try 

End Sub 
End Class 
+0

@Steven Doggart:'對象引用未設置爲對象的實例','值不能爲空。參數名稱:source' - 我得到了這個錯誤先生,但是當我在加載事件中刪除'Refreshlist()'時。我已經在下面跟着你的更正,但是這個錯誤發生了:( – VBeginner 2013-02-21 16:11:44

回答

1

第一步是將項目存儲在屏幕外的內存中。例如:

lstword.Items.Clear() 
lstword.Items.AddRange(
    words.FindAll(
     Function(word) Return word.ToString().Contains(txtSearch.Text) 
     ).ToArray() 
    ) 

或者,使用LINQ:

Dim words As List(Of Object) 

然後,當你刷新列表框,只有與在內存中的列表匹配當前的標準該項目填充它

lstword.Items.Clear() 
lstword.Items.AddRange(
    words.Where(
     Function(word) word.ToString().Contains(txtSearch.Text) 
     ).ToArray() 
    ) 

UPDATE

由於英語新是具有EEM無法得到它的工作,這是很難說沒有實際看到它有什麼錯你的代碼,這裏有一個完整的工作示例:

Public Class Form1 
    Dim words As New List(Of Object)(New String() {"apple", "banana", "berry", "cashew", "lemon", "mango", "peanut"}) 

    Private Sub RefreshList() 
     lstword.Items.Clear() 
     lstword.Items.AddRange(
      words.Where(
       Function(word) word.ToString().Contains(txtSearch.Text) 
       ).ToArray() 
      ) 
    End Sub 

    Private Sub txtSearch_TextChanged(sender As Object, e As EventArgs) Handles txtSearch.TextChanged 
     RefreshList() 
    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
     RefreshList() 
    End Sub 
End Class 

更新2

我試着用你的代碼與我推薦的建議,它工作得很好。這是爲我工作的代碼。試試吧,讓我知道,如果它不爲你工作:

Public Class Glossary 
    Private Sub Glossary_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     List() 
     Refreshlist() 
    End Sub 

    Private Sub List() 
     word.AddRange(New String() {"apple", "banana", "berry", "cashew", "lemon", "mango", "peanut"}) 
    End Sub 

    Private word As New List(Of Object)() 

    Private Sub Refreshlist() 
     lstword.Items.Clear() 
     lstword.Items.AddRange(word.Where(Function(word) word.ToString().Contains(txtSearch.Text)).ToArray()) 
    End Sub 

    Private Sub txtSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged 
     Refreshlist() 
    End Sub 
End Class 

如果這樣的作品,那麼所有你需要做的是改變List方法來從數據庫中加載的而不是硬編碼的列表。

+0

對不起,先生,我沒有那麼容易,你是說我應該在表格的類裏面寫下'Dim words As List(Of Object)'?那麼下一個代碼應該放在lstword方法中,還是我應該爲它做一個函數? (我真的很抱歉,先生,我不熟悉這些條款,並且我剛剛學到了一些關於這個問題的知識。請原諒我)。 – VBeginner 2013-02-20 22:20:36

+1

是的,我會說你很可能希望'words'變量在表單類中的類/表單級聲明,但在任何方法之外。在該範圍內聲明的變量稱爲* fields *。你也應該使它成爲'Private',而不是使用'Dim',默認情況下會使字段爲Public。填充列表框的代碼塊將很好地放入其自己的方法中。我會調用方法'RefreshList'或類似的東西。大概你需要從不止一個地方(從裝載和文本改變)調用它,所以將它作爲一個單獨的方法是有意義的。 – 2013-02-20 23:49:26

+0

我非常感謝你的好意,先生,真的:),但我在前面得到了另一個關於我的問題的解決方案。我已經更新了上面的問題,請先看看它的先生。 – VBeginner 2013-02-21 06:07:42

0

讓您的初始列表關閉數據庫,在列表類e.g列表彈出它。 使用您的搜索文本來選擇所有匹配的項目,並將它們放入列表框中。空白搜索文本,你只是把他們所有英寸

你也許想看看Foreach和List.FindAll以及。

+0

感謝你的建議,請給我一個例子先生? – VBeginner 2013-02-20 21:21:50

+1

看起來像史蒂文Doggart是這樣做的。我的例子將在C夏普,我懷疑你需要在沒有意識到這對你來說有多新,實際上這是中級的東西,我不確定你是否已經選擇了新手,最好的方式是使用我們,閱讀書籍和教程然後當你陷入困境時尋求幫助。我們可以給你的代碼,但你只需將它粘貼到你的應用程序就可以學到很少。 – 2013-02-20 23:58:24

+0

是的..我剛開始學習VB,所以這個中間的東西對我來說還是新的。我不是一個好的程序員,但我想成爲一個如此原諒我,如果我有時無法輕鬆地接受這個想法。我已經在做你說的先生了,再次感謝:) – VBeginner 2013-02-21 06:17:06