如何填充了大量的信息列表视图不堵塞?(How to populate listview with a

2019-09-17 03:04发布

我创建一个后台线程ListViewItems的数组,然后我填充我的列表视图与它在UI线程上。 问题是,如果数组太大的UI块,而列表视图更新。

有没有办法用在UI上小的冲击,以填充ListView?

Answer 1:

如果你有大量的数据,进入它,你可能想使用它的虚拟模式,通过设置VirtualMode ListView控件的属性true 。 这意味着,ListView控件将不会在传统意义上被填充,但你会挂钩的事件处理程序,其中作为被显示的项目你必须把信息列表视图小块。

很简单的例子:

private List<string> _listViewData = new List<string>();
private void toolStripButton1_Click(object sender, EventArgs e)
{
    _listViewData = GetData(); // fetch the data that will show in the list view
    listView1.VirtualListSize = _listViewData.Count; // set the list size
}
// event handler for the RetrieveVirtualItem event
private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
    if (e.ItemIndex >= 0 && e.ItemIndex < _listViewData.Count)
    {
        e.Item = new ListViewItem(_listViewData[e.ItemIndex]);
    }
}

你也应该考虑使用CacheVirtualItems事件。



Answer 2:

您还可以使用的BeginUpdate和EndUPdate方法

   listView1.BeginUpdate();
   //Add Values
   listView1.EndUpdate();


Answer 3:

我的意见得到了相当长,所以我决定把这个单独的职位。

首先,+1弗雷德里克莫克,使用VirtualMode是要走的路。 但是,你失去一些功能,例如列自动调整大小和排序更容易对自己的处理。

如果这是一个问题,从一个工作线程填充听起来可能听起来很诱人。 然而,人口仍然会采取拥有该列表控制(即实际上总是在主线程)的线程的地方- .NET使得通过强制你使用可见光(Begin)Invoke 。 此外,上下文切换将显着增加您需要填写所有项目,如果你填写一个接一个的总时间,所以要填块(比如说50个项目的时间,甚至更好的填充很多,你可以在20毫秒)。 再加上,当内容的变化,你有一个不那么恒星的结果相当复杂的解决方案的附加同步所需。



文章来源: How to populate listview with a lot of information without blocking?