将VirtualMode 属性设置为 true 会将 ListView 置于虚拟模式。控件不再使用Collection.Add()这种方式来添加数据,取而代之的是使用RetrieveVirtualItem(Occurs when the ListView is in virtual mode and requires a ListViewItem.)和CacheVirtualItems两个事件,单独使用RetrieveVirtualItem也可以,CacheVirtualItems这个事件主要是为了方便编程人员操作缓冲集合,其参数CacheVirtualItemsEventArgs有StartIndex和EndIndex两个属性在虚拟模式下。

  在虚拟模式下,从缓冲之中获取所需的数据进行加载,性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能。

示例代码:

using System;
using System.Collections.Generic;
using System.Windows.Forms; namespace WinFormTest
{
public partial class Form1 : Form
{
private List<ListViewItem> myCache;
public Form1()
{
InitializeComponent(); myCache = new List<ListViewItem>();
} private void Form1_Load(object sender, EventArgs e)
{
listView1.View = View.Details;
listView1.VirtualMode = true; listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem); } void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (myCache != null )
{
e.Item = myCache[e.ItemIndex];
}
else
{
//A cache miss, so create a new ListViewItem and pass it back.
int x = e.ItemIndex * e.ItemIndex;
e.Item = new ListViewItem(x.ToString());
}
} private void button1_Click(object sender, EventArgs e)
{
List<Student> list = GetStudentList();
foreach (var item in list)
{
ListViewItem listViewItem = new ListViewItem();
listViewItem.SubItems[].Text = item.Name;
listViewItem.SubItems.Add(item.Sex);
myCache.Add(listViewItem);
}
listView1.VirtualListSize = myCache.Count;
} private List<Student> GetStudentList()
{
List<Student> list = new List<Student>();
for (int i = ; i < ; i++)
{
Student stu = new Student { Name = "student" + i, Sex = "男" };
list.Add(stu);
}
return list;
} private void button2_Click(object sender, EventArgs e)
{ ListViewItem listItem = new ListViewItem();
listItem.SubItems[].Text = "女";
listItem.SubItems.Add("哈哈");
myCache.Add(listItem);
listView1.VirtualListSize = myCache.Count;
listView1.Invalidate();
} } public class Student
{
public string Sex { get; set; }
public string Name { get; set; }
}
}

子线程+虚拟模式操作listview

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading; namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private List<ListViewItem> myCache;
private delegate void DispMSGDelegate(int index, string MSG); public Form1()
{
InitializeComponent();
this.listView1.Columns.Add("编号", , HorizontalAlignment.Right);
this.listView1.Columns.Add("姓名", , HorizontalAlignment.Right);
myCache = new List<ListViewItem>(); } private void button1_Click(object sender, EventArgs e)
{
progressBar1.Maximum = ;
Thread tWorkingThread = new Thread(Thread_DisplayMSG);
//ChaosThreadList.Add(tWorkingThread);
tWorkingThread.Start(); }
private void Thread_DisplayMSG()
{
List<Student> list = GetStudentList();
int k = ;
foreach (var item in list)
{
progressBar1.Value = k;
k++; DispMsg(k, item.Name);
}
listView1.VirtualListSize = myCache.Count;
} private void DispMsg(int iIndex, string strMsg)
{
if (this.listView1.InvokeRequired == false) //如果调用该函数的线程和控件lstMain位于同一个线程内
{
ListViewItem listViewItem = new ListViewItem();
listViewItem.SubItems[].Text = iIndex.ToString();
listViewItem.SubItems.Add(strMsg);
myCache.Add(listViewItem);
}
else //如果调用该函数的线程和控件lstMain不在同一个线程
{
//通过使用Invoke的方法,让子线程告诉窗体线程来完成相应的控件操作
DispMSGDelegate DMSGD = new DispMSGDelegate(DispMsg); //使用控件lstMain的Invoke方法执行DMSGD代理(其类型是DispMSGDelegate)
this.listView1.Invoke(DMSGD, iIndex, strMsg); }
} private List<Student> GetStudentList()
{
List<Student> list = new List<Student>();
for (int i = ; i < ; i++)
{
Student stu = new Student { Name = "student" + i, Sex = "男" };
list.Add(stu);
}
return list;
}
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (myCache != null)
{
e.Item = myCache[e.ItemIndex];
}
else
{
//A cache miss, so create a new ListViewItem and pass it back.
int x = e.ItemIndex * e.ItemIndex;
e.Item = new ListViewItem(x.ToString());
}
} private void Form1_Load(object sender, EventArgs e)
{
listView1.View = View.Details;
listView1.VirtualMode = true; listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
} }
public class Student
{
public string Sex { get; set; }
public string Name { get; set; }
}
}

WinForm ListView虚拟模式加载数据 提高加载速度的更多相关文章

  1. 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

    实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...

  2. [Python]-pandas模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载文件

    <Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...

  3. [Python]-sklearn模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载数据集

    <Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...

  4. ListView虚拟模式封装

    public class ListViewAH : ListViewEx { #region 虚拟模式相关操作 ///<summary> /// 前台行集合 ///</summary ...

  5. AJAX删除事件与加载数据

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 微信小程序云开发-列表数据分页加载显示

    一.准备工作 1.创建数据库nums,向数据库中导入108条数据 2.修改数据库表nums的权限 二.新建页面ListPaginated 1.wxml文件 <!-- 显示列表数据 --> ...

  7. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  8. WinForm ListView不分页加载大量数据

    WinForm的ListView在加载大量数据时会出现闪烁的问题,同时数据加载很慢.如果你的列表中有超过千条的数据且不做特殊处理还是用普通的ListView.Items.Add(),估计你的用户得抱怨 ...

  9. ListView用法及加载数据时的闪烁问题和加载数据过慢问题

    ListView介绍及添加数据时的闪烁问题 1.     ListView类 1.1 ListView常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示 ...

随机推荐

  1. PAT L3-008 喊山

    https://pintia.cn/problem-sets/994805046380707840/problems/994805050709229568 喊山,是人双手围在嘴边成喇叭状,对着远方高山 ...

  2. Spring源码阅读学习一

    昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...

  3. node的router路由。

    使用router可以实现一个小型的express. router继承了大部分的app = express()的方法. 使用router可以工程化管理项目.router使用以后app只能在最开始去存在. ...

  4. Python 爬虫 --- urllib

    对于互联网数据,Python 有很多处理网络协议的工具,urllib 是很常用的一种. 一.urllib.request,request 可以很方便的抓取 URL 内容. urllib.request ...

  5. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

  6. 详细且透彻的分析PCA原理

    前两天面试问到了PCA,感觉讲得不是很透彻,这里再次详细写一下. 首先定义如下变量的含义: X:Rn*m,n个样本m个属性,对于第i个样本xi:R1*m. W:Rm*k,k个正交的单位正交的列向量组成 ...

  7. linux利用CMakeLists编译程序或生成库文件

    #设置CMAKE最低版本 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #设置项目名称 SET(PROJECT_NAME Image_Test_01) #建立项目 PROJE ...

  8. map内置函数分析所得到的思路

    map:会根据提供的函数对指定序列做映射. map(func, *iterables) --> map object Make an iterator that computes the fun ...

  9. C++拷贝构造函数与 = 重载

    调用拷贝构造函数进行初始化的时候,是不会调用=重载的. // test.cpp : 定义控制台应用程序的入口点. // //#include "stdafx.h" #include ...

  10. css修改input表单默认样式重置与自定义大全

    链接地址: 伪元素表单控件默认样式重置与自定义大全 http://www.zhangxinxu.com/wordpress/?p=3381 Chrome 现在不支持通过伪元素修改 meter 元素样式 ...