【问题标题】:How to efficiently insert multiple rows at the start of a ListView?如何在 ListView 的开头有效地插入多行?
【发布时间】:2020-10-21 16:49:32
【问题描述】:

我有一个 ListView 和一个 ListViewItem 集合。我只是想在 ListView 的顶部插入集合中的所有项目。

目前,我正在这样做:

CollectionOfListViewItems.Sort(New CustomComparer(SortOrder.Descending))
For Each lvi As ListViewItem In CollectionOfListViewItems
    TargetListView.Items.Insert(0, lvi)
Next

由于每次插入操作都会移动 ListView 中的所有项目,因此每次插入操作都会花费 O(n) 时间,这似乎有点浪费。

有没有更好的方法来解决这个问题?请注意,我知道InsertRange(),但不幸的是,该方法不适用于集合ListView.Items

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

    无论您是追加还是插入项目,每当您对 ListView 进行较大更改时,您都应该在进行更改之前调用BeginUpdate(),然后再调用EndUpdate()。这将阻止 ListView 直观地更新其项目(这是花费时间最多的部分)。

    您的代码应如下所示:

    TargetListView.BeginUpdate()
    
    For Each lvi As ListViewItem In CollectionOfListViewItems
        TargetListView.Items.Insert(0, lvi)
    Next
    
    TargetListView.EndUpdate()
    

    参考资料:

    【讨论】:

    • 哦,我的意思是 InsertRange() 而不是 AddRange()...
    • @Burhan 好吧。好吧,答案仍然是一样的。使用BeginUpdate()EndUpdate() 可以显着减少执行循环所需的时间。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多