C#为listview设置虚拟模式,虚拟模式在许多情况下都很有用。 如果必须从已存在于内存中的非常大的集合填充一个 ListView 对象,则为每项创建一个 ListViewItem 对象会很浪费。 在虚拟模式下,从缓冲之中获取所需的数据进行加载,
性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能,特别是当导入的excel数据多于30万行甚至50万行数据时,为listview设置虚拟模式是有必要的。
性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能,特别是当导入的excel数据多于30万行甚至50万行数据时,为listview设置虚拟模式是有必要的。
protected List<ListViewItem> ItemsSource
{
get;
private set;
}
protected List<ListViewItem> CurrentCacheItemsSource
{
get;
private set;
}
private void LoadListViewItems(List<ListViewItem> items)
{
g_loadUIDlistView.Items.Clear();
g_loadUIDlistView.VirtualListSize = items.Count;//设置虚拟列表容量大小
g_loadUIDlistView.VirtualMode = true;//设置虚拟模式
g_loadUIDlistView.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);//绑定虚拟操作
}
//在RetrieveVirtualItem方法中加载相关的数据
void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count == 0)
{
return;
}
e.Item = this.CurrentCacheItemsSource[e.ItemIndex];
//当e.ItemIndex 的值与缓存中的集合大小相等时,设置缓存为NULL(对象根引用设置为NULL,
//内存中的对象不再有根引用,所需的内存将由GC第二次回收时释放,相关内容请查看CLR GC)
if (e.ItemIndex == this.CurrentCacheItemsSource.Count)
{
this.CurrentCacheItemsSource = null;
}
}