Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net vb2008使用文本框在列表框中搜索_Vb.net_Textbox_Listbox - Fatal编程技术网

Vb.net vb2008使用文本框在列表框中搜索

Vb.net vb2008使用文本框在列表框中搜索,vb.net,textbox,listbox,Vb.net,Textbox,Listbox,您好,我有一个表单,可以使用文本框查找列表框中的项目,或者我应该说是筛选。我有一个用于搜索的文本框和一个填充了数据库中项目的列表框。现在,比如listbox项目包括苹果、香蕉、浆果、腰果、柠檬、芒果、花生。如果我在文本框中键入“b”,列表框将只显示香蕉和浆果。如果我键入“ba”,列表框将只显示香蕉,但如果我键入“be”,列表框将显示浆果等。我已经开始工作了(在txtSearch事件中代码标记为注释)。我的问题是,当用户点击退格键时,如何将列表框中的项目带回来?因为,假设我现在在列表框中有香蕉和浆

您好,我有一个表单,可以使用文本框查找列表框中的项目,或者我应该说是筛选。我有一个用于搜索的文本框和一个填充了数据库中项目的列表框。现在,比如listbox项目包括苹果、香蕉、浆果、腰果、柠檬、芒果、花生。如果我在文本框中键入“b”,列表框将只显示香蕉和浆果。如果我键入“ba”,列表框将只显示香蕉,但如果我键入“be”,列表框将显示浆果等。我已经开始工作了(在txtSearch事件中代码标记为注释)。我的问题是,当用户点击退格键时,如何将列表框中的项目带回来?因为,假设我现在在列表框中有香蕉和浆果,当我删除我在文本框中键入的文本时,它应该再次列出所有项目,以便如果我想搜索其他项目,它将再次被过滤。提前谢谢

代码更新

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

从数据库中获取初始列表,将其放入列表类中,例如list。 使用您的搜索文本选择所有匹配项并将其放入列表框中。空白搜索文本,您只需将它们全部放入


您可能还需要查看Foreach和List.FindAll。

第一步是将项目存储在屏幕外内存中。例如:

Dim words As List(Of Object)
然后,在刷新列表框时,仅使用内存中列表中与当前条件匹配的项目填充列表框:

lstword.Items.Clear()
lstword.Items.AddRange(
    words.FindAll(
        Function(word) Return word.ToString().Contains(txtSearch.Text)
        ).ToArray()
    )
或者,使用LINQ:

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

由于您似乎很难让它正常工作,并且在没有看到代码的情况下很难说出代码的错误,因此下面是一个完整的工作示例:

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
方法更改为从数据库加载,而不是硬编码列表。

谢谢您的建议,先生,您能举个例子吗?看起来Steven Doggart正在这样做。我的例子是C夏普,我怀疑你现在是否需要它。我也不知道这对你来说有多新鲜。这实际上是中间的东西,我不确定你们是否已经学会了新手。使用我们的最佳方式是尝试一下,阅读书籍和教程,然后在遇到困难时寻求帮助。我们可以只给你代码,但是你只需要将它粘贴到你的应用程序中,就可以学到很少的东西。是的..我刚刚开始学习VB,所以这个中间的东西对我来说还是新的。我不是一个好的程序员,但我正在努力成为一个好的程序员,所以请原谅我有时不能很容易地理解这个想法。我已经在做你说的了,先生,再次感谢:)编程是一件你只能通过实践来学习的事情,你正在取得一个良好的开端。至少你知道你不知道怎么做,有太多的人不知道……尽管我从1976年开始做,但我仍在学习,没有停止的计划。对不起,先生,我没那么容易,你的意思是我应该只在表单类中写
模糊单词作为列表(对象)
?那么下一个代码应该放在lstword方法中,或者我应该为它创建一个函数?(真的,真的很抱歉,先生,我不熟悉这些术语,而且我刚刚了解了一些关于这个主题的知识。请原谅我)。是的,我想说的是,您很可能希望
words
变量在类/表单级别声明,在表单类内部,但在任何方法之外。在该范围内声明的变量称为字段。您也应该将其设置为
私有
,而不是使用默认情况下使字段
公共的
Dim
。填充列表框的代码块最好放在它自己的方法中。我会调用方法
RefreshList
或类似的东西。大概您需要从多个地方调用它(从加载和文本更改),因此将其作为一个单独的方法是有意义的。我感谢您的好意,先生,真的:),但我在上一节中得到了关于我的问题的另一个解决方案。我已经更新了我上面的问题,请看一下,先生。很明显,如果您从列表框中删除了项目,并且没有按照我的建议将它们保存在内存中的单独对象中,那么就没有办法将删除的项目取回(即,除了重新查询数据库)。正是因为你遇到了这样一个短暂的机会,我才建议你按照我的方式去做。取回以前删除的项目的唯一方法是将完整列表保留在内存中的某个位置。这就是为什么Tony和我都建议将完整列表保存在
list
对象中的原因。您的第一个问题是从未将
words
变量设置为新对象。要解决此问题,请将
Dim word As List(Of Object)
更改为
Private word As List(Of Object)
。第二个问题是,您从未填充
word
列表。要解决这个问题,请将行
lstword.Items.Add(myDataTable.Rows(i)(“word”))更改为
word.Add(myDataTable.Rows(i)(“word”)
。另外,在
txtSearch\u TextChanged
方法中,只需调用
RefreshList
。不要在其中执行任何其他操作。@Steven Doggart:“对象引用未设置为对象的实例”和“值不能为null”。参数名称:source'-我得到了那个错误,先生,但是当我在load事件中删除
Refreshlist()
时。我已经按照下面的更正进行了操作,但出现了以下错误:(