【问题标题】:filtering llistview takes a long time过滤llistview需要很长时间
【发布时间】:2021-03-13 20:21:18
【问题描述】:

我在一个包含大约 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

【问题讨论】:

  • @HansPassant 我正在使用 VB.net
  • .NET 文档不关心语言。查看该页面的右上角,“下载”按钮下方。点击`>`并选择vb.net
  • 通过非可视组件进行过滤可能会好得多,然后使用列表框之类的东西来显示结果。列表框中显示的数据的来源是什么?

标签: vb.net listview filter


【解决方案1】:

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

代替旧的 VB6 InStr 使用 .Contains。您可以在.net 中结合.ToLower.Contains 对方法进行字符串化。 Contains 返回 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    • 2012-11-26
    • 2019-12-27
    • 2017-10-22
    相关资源
    最近更新 更多