我创建一个后台线程ListViewItems的数组,然后我填充我的列表视图与它在UI线程上。 问题是,如果数组太大的UI块,而列表视图更新。
有没有办法用在UI上小的冲击,以填充ListView?
我创建一个后台线程ListViewItems的数组,然后我填充我的列表视图与它在UI线程上。 问题是,如果数组太大的UI块,而列表视图更新。
有没有办法用在UI上小的冲击,以填充ListView?
如果你有大量的数据,进入它,你可能想使用它的虚拟模式,通过设置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
事件。
您还可以使用的BeginUpdate和EndUPdate方法
listView1.BeginUpdate();
//Add Values
listView1.EndUpdate();
我的意见得到了相当长,所以我决定把这个单独的职位。
首先,+1弗雷德里克莫克,使用VirtualMode
是要走的路。 但是,你失去一些功能,例如列自动调整大小和排序更容易对自己的处理。
如果这是一个问题,从一个工作线程填充听起来可能听起来很诱人。 然而,人口仍然会采取拥有该列表控制(即实际上总是在主线程)的线程的地方- .NET使得通过强制你使用可见光(Begin)Invoke
。 此外,上下文切换将显着增加您需要填写所有项目,如果你填写一个接一个的总时间,所以要填块(比如说50个项目的时间,甚至更好的填充很多,你可以在20毫秒)。 再加上,当内容的变化,你有一个不那么恒星的结果相当复杂的解决方案的附加同步所需。