WinForm ListView虚拟模式加载数据 提高加载速度
将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虚拟模式加载数据 提高加载速度的更多相关文章
- 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)
实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...
- [Python]-pandas模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载文件
<Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...
- [Python]-sklearn模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载数据集
<Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...
- ListView虚拟模式封装
public class ListViewAH : ListViewEx { #region 虚拟模式相关操作 ///<summary> /// 前台行集合 ///</summary ...
- AJAX删除事件与加载数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 微信小程序云开发-列表数据分页加载显示
一.准备工作 1.创建数据库nums,向数据库中导入108条数据 2.修改数据库表nums的权限 二.新建页面ListPaginated 1.wxml文件 <!-- 显示列表数据 --> ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- WinForm ListView不分页加载大量数据
WinForm的ListView在加载大量数据时会出现闪烁的问题,同时数据加载很慢.如果你的列表中有超过千条的数据且不做特殊处理还是用普通的ListView.Items.Add(),估计你的用户得抱怨 ...
- ListView用法及加载数据时的闪烁问题和加载数据过慢问题
ListView介绍及添加数据时的闪烁问题 1. ListView类 1.1 ListView常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示 ...
随机推荐
- laravel orm 中的一对多关系 hasMany
个人对于laravel orm 中对于一对多关系的理解 文章表 article,文章自然可以评论,表 comment 记录文章的评论,文章和评论的关系就是一对多,一篇文章可以有多个评论. 在 comm ...
- [转帖]Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有
Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有 之前用 千兆的机器 下载速度 一般只能到 50MB 左右 没法更高 万兆的话 可能也就是 200MB左右的速度 很难更高 不知道后续的服 ...
- pxe+kickstart 自动化部署linux操作系统
kickstart 是什么? 批量部署Linux服务器操作系统 运行模式: C/S client/server 服务器上要部署: DHCP tftp(非交互式文件共享) 安装系统的三个步骤: 1.加载 ...
- Java之枚举举例
package enumdemo; /** * 枚举类 */ public enum MAPPER { // 实例 ELEMENT_NAME("mapper"), ATTRIBUT ...
- python之OrderedDict类
# OrderedDict类使用举例 # OrderedDict类的使用与字典相似,不同的是OrderedDict类会记录键值对的添加顺序 from collections import Ordere ...
- jdk1.8 HashMap扩容原理详解
JDK1.7中,resize时,index取得时,全部采用重新hash的方式进行了.JDK1.8对这个进行了改善. 以前要确定index的时候用的是(e.hash & oldCap-1),是取 ...
- nginx-匹配规则
location 指令的作用是根据用户请求的URI来执行不同的应用. locationn使用的语法为 location [=|~|~*|^~] uri { .... } location 语法说明表 ...
- BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交
题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道.机智 ...
- Luogu3676 小清新数据结构题(树链剖分+线段树)
先不考虑换根.考虑修改某个点权值对答案的影响.显然这只会改变其祖先的子树权值和,设某祖先原子树权值和为s,修改后权值增加了x,则对答案的影响为(s+x)2-s2=2sx+x2.可以发现只要维护每个点到 ...
- ajax跨域,携带cookie
解决方案很简单. 直接上代码: web.xml中: 添加了 cors来解决跨域 (奇怪的是,credentials设置为false.反正这个是照搬的...) <filter> ...