0

こんにちは、テキストボックスを使用してリストボックス内の項目を検索する、またはフィルター処理するフォームがあります。検索に使用するテキストボックスと、データベースからのアイテムが入力されたリストボックスがあります。ここで、リストボックスの項目にリンゴ、バナナ、ベリー、カシュー、レモン、マンゴー、ピーナッツが含まれているとします。テキストボックスに「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
4

2 に答える 2

1

最初のステップは、アイテムを画面外のメモリに保存することです。例えば:

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それが機能する場合は、ハードコードされたリストではなく、データベースからロードする方法を変更するだけです。

于 2013-02-20T21:21:17.457 に答える
0

データベースから最初のリストを取得し、List クラスなどでポップします。検索テキストを使用して、一致するすべてのアイテムを選択し、リスト ボックスに入れます。それらすべてを入力した空白の検索テキスト。

Foreach と List.FindAll も参照してください。

于 2013-02-20T21:18:04.620 に答える