2013-02-20 78 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