0

尝试修改 ListView 的子项文本时遇到问题(大约 20k 条记录,启用虚拟模式 = false)。

list.BeginUpdate();

for(int i = 0; i < list.Items.Count; i++)
{
   list.Items[i].SubItem[3].Text = "";
}

list.EndUpdate();

尽管使用:

var worker = new BackgroundWorker();

worker.DoWork += (s, e) => 
{
    list.BeginUpdate();

    for(int i = 0; i < list.Items.Count; i++)
    {
        list.Invoke((MethodInvoker)(() => { list.Items[i].SubItem[3].Text = ""; }));
    }

    list.EndUpdate();
};

worker.RunWorkAsync();

任何帮助表示赞赏!

4

1 回答 1

3

我不建议使用后台线程来执行此操作。您的后台线程采取的唯一操作是更新 UI,因此它所做的每次调用都是针对 UI 的——在后台没有真正发生不涉及 UI 的事情。

在我的脑海中,我想不出任何比直接for循环遍历所有项目更快的方法。如果有的话,使用后台线程会使事情变慢,因为必须在 UI 线程上调用每个记录更新。

可能有一个我现在没有想到的更好的解决方案,但我会这样做:

list.BeginUpdate ();

for(int i = 0; i < list.Items.Count; i++)
{
   list.Items[i].SubItem[3].Text = "";
}

list.EndUpdate ();

BeginUpdate()/EndUpdate()函数可用于在批量修改控件数据时暂停控件的 UI 更新 - 这大大加快了循环速度。

作为替代方案,您可以尝试更新列表中显示的数据副本,然后删除所有项目并使用AddRange.

我不确定哪种解决方案会更快(可能是直接更新),但您应该真正考虑使用虚拟列表或在列表中显示更少的项目。很少有用户能真正处理列表中的 20K 条记录——即使滚动浏览它也一定很痛苦才能找到特定的项目。

如果您使用VirtualMode,您可以将所有数据保存在您自己的列表中,并且只显示实际适合控件窗口的项目。当您需要更新数据时,您只需要更新您自己的副本,您将只更新那些显示在 UI 上的列表视图项,而不是整个 20K 集。

于 2013-09-03T06:33:11.243 回答