过滤列表视图需要很长时间

filtering llistview takes a long time

我在包含大约 3400 行的表单中使用 Listview。当我想通过删除不包含我正在过滤的字符串的一次来过滤行时,需要很长时间。难道不应该有更快的方法吗?

Private Sub FilterListView()
        Try
            Dim pos As Int32
            Dim listItem As ListViewItem
            
            For pos = ListView1.Items.Count - 1 To 0 Step -1
                listItem = ListView1.Items(pos)
                If Not InStr(1, ListView1.Items(pos).SubItems(1).Text.ToLower, FilterParameter.ToLower) > 0 Then
                    ListView1.Items(pos).Remove()

                End If
            Next
            Me.Cursor = Cursors.Default
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

使用 BeginUpdateEndUpdate。这可以防止屏幕在每次移除时重新绘制,从而大大减慢速度。一个小的优化是在循环之前将 FilterParameter 更改为小写,而不是在每次迭代时都更改。

使用 .Contains 代替旧的 VB6 InStr。您可以在 .net 中组合 .ToLower.Contains 中的字符串方法。 Contains returns TrueFalse 所以它适用于 If.

Private FilterParameter As String

Private Sub FilterListView()
    ListView1.BeginUpdate()
    Dim lcSearch = FilterParameter.ToLower
    For Each listItem As ListViewItem In ListView1.Items
        If listItem.Text.ToLower.Contains(lcSearch) Then
            listItem.Remove()
        End If
    Next
    ListView1.EndUpdate()
End Sub