过滤列表视图需要很长时间
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
使用 BeginUpdate
和 EndUpdate
。这可以防止屏幕在每次移除时重新绘制,从而大大减慢速度。一个小的优化是在循环之前将 FilterParameter
更改为小写,而不是在每次迭代时都更改。
使用 .Contains
代替旧的 VB6 InStr
。您可以在 .net 中组合 .ToLower
和 .Contains
中的字符串方法。 Contains
returns True
或 False
所以它适用于 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
我在包含大约 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
使用 BeginUpdate
和 EndUpdate
。这可以防止屏幕在每次移除时重新绘制,从而大大减慢速度。一个小的优化是在循环之前将 FilterParameter
更改为小写,而不是在每次迭代时都更改。
使用 .Contains
代替旧的 VB6 InStr
。您可以在 .net 中组合 .ToLower
和 .Contains
中的字符串方法。 Contains
returns True
或 False
所以它适用于 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