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) 提示 ...
随机推荐
- HTML 选择器
c56 div:nth-of-type(1) { margin-left: 12px; margin-top: 25px; } .c56 div:nth-of-type(2) { margin-top ...
- pom.xml mevan 的 配置文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- Linux查看版本
最简单的命令 lsb_release -a 查看机器名 hostname 查看内核版本 uname -r 红帽 centos 查看版本 cat /etc/redhat-release ubuntu 查 ...
- MongoDb在windows10下的安装、创建用户和数据库
1.mongodb下载地址https://www.mongodb.com/download-center#community 2.安装 3.在D:\MongoDB目录下创建db和log两个文件夹 ...
- 关于RabbitMQ Queue Argument的简介
1.Message TTL message在队列queue中可以存活多长时间,以毫秒为单位:发布的消息在queue时间超过了你设定的时间就会被删除掉. channel.queueDeclare(&qu ...
- jQuery 簡介
jQuery:是一個js庫,可以極大地簡化編程,“寫得少做得多”. jquery的作用: 挑選元素.操作屬性.事件函數.動畫和效果.ajax: jQuery庫:google和microsoft都支持, ...
- selenium之测试角色管理页面举例
# 测试角色权限管理页面功能 # author:xr # date:2017-07-20 from selenium import webdriver from login_page import L ...
- MySQL Binlog详解
MySQL Binlog详解 Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被bi ...
- mybatis 缓存(cache)的使用
许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的.类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsessio ...
- docker--compose--sonarqube
Create this docker-compose.yml file: version: "2" services: sonarqube: image: sonarqube po ...