#.NET# DataGrid显示大量数据——DataGridView虚模式
要解决的目标:如何让 Datagridview 快速平滑显示大量数据
通常,Winform 下的表格控件是很“低效”的,如 DataGrid 和 DataGridView。造成低效的原因在于在默认的设定下,它们都诚实的和数据源做了“真绑定”,这种绑定无论你使用了那种方式对数据源进行载入和管理,表格控件都会和全部的数据一一进行认识,并根据它们的数量和类型,逐个创建行和单元格。——也就是说,数据源有1万个单元格,表格控件默认就会对这1万个数据进行认识和创建并显示出来,怎么能不慢。
注:数据源是指和表格控件绑定的或通过其它方式对表格控件赋值的所有数据来源,并非数据库中的所有数据。
解决方式两点,虚模式显示和双缓冲加持。
虚模式,VirtualMode = true。是 DataGridView 中一个属性,当开启时显示转为虚模式显示,和不开启的区别就是
不开启时,显示不显示,用不用的着的单元格都会被创建和使用,开启后,只有当单元格显示或被使用时,才按需引发事件
个人理解就是,虚模式当某位置单元格需要被显示或处理业务时,表格控件会通过引发各类事件通知代码,要求提供下一步动作,从而大幅度节省“不需要的开销”。比如一个窗体上能显示100个单元格时,就对这100个做请求,编码人员可以根据位置提供这100个单元格的内容,窗体上永远最多显示100个。位置是固定的,内容是变化的。
实现方法是:
- 首先开启 VirtualMode = true
- 为 DataGridView 添加列,用于显示数据
- 为 DataGridView 添加行,这将会引发RowNeeded事件和CellValueNeeded事件,从而可以在事件中处理对被需要的单元格赋予何值。
const int initialSize = 3000;
//get data
dataPool = await DataTransfer.GetData(AppConfig.DbConnectionString, "grades", 1, 3000);
dgvShow.Rows.Clear();
dgvShow.Columns.Clear();
dgvShow.VirtualMode = true;
dgvShow.ReadOnly = true;
foreach(DataColumn col in dataPool.Columns)
{
dgvShow.Columns.Add(col.ColumnName, col.ColumnName);
}
//此句用于控制 DataGridView 显示行数,同时起到添加行引发事件的作用
dgvShow.RowCount = initialSize;
private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (dataPool != null)
{
e.Value = dataPool.Rows[e.RowIndex][e.ColumnIndex];
}
}
上面的代码,先获取到拥有3000行数据的 DataTable,然后设定 DataGridView 开启虚模式并“创建”行来引发相关事件。在 CellValueNeeded 中将数据表中对应数据显示到表格控件中。
上面的行为只是解决了部分问题,避免了表格控件的性能的严重浪费,但数据较多时会发现拉动时依旧会“卡”,这就要解决平滑显示的问题。
使用双缓冲来解决
using System.Reflection;
...
public void DoubleBuffered(DataGridView dgv, bool setting)
{
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dgv, setting, null);
}
上面的代码利用反射,对表格控件的 DoubleBuffered 属性进行设定,为什么不能直接设定?因为其 DoubleBuffered 是 protected 的,不使用反射无法访问。
#.NET# DataGrid显示大量数据——DataGridView虚模式的更多相关文章
- winform DataGridView的虚模式填充,CellValueNeeded事件的触发条件
虚模式填充常用来处理大量数据,某个字段的显示问题. DataGridView是.net 2.0新增的表格数据编辑和显示控件,简单的数据显示和编辑,只需直接和数据源绑定就可以了. 对于 一些特殊情况,我 ...
- C#将dataGridView中显示的数据导出到Excel(大数据量超有用版)
开发中非常多情况下须要将dataGridView控件中显示的数据结果以Excel或者Word的形式导出来,本例就来实现这个功能. 因为从数据库中查找出某些数据列可能不是必需显示出来,在dataGrid ...
- 清除DataGridView显示的数据
一.DataGridView未绑定数据时清空数据 this.dgv_PropDemo.DataSource = null 二.DataGridView绑定数据时清空数据 DataGridView绑定了 ...
- silverlight DataGrid 显示篇
silverlight DataGrid 显示篇 分类: Silverlight2012-05-12 21:55 693人阅读 评论(0) 收藏 举报 datagridsilverlightbindi ...
- EasyUI datagrid 在ie8和360兼容模式兼容性问题
问题:easyui中的datagrid在ie8和360兼容模式下显示不出来. 答案:不是easyui的问题.是引入的jquery版本问题.jquery-1.5.1抛异常,这个版本是mvc3自带的jqu ...
- 解决easyui datagrid加载数据时,checkbox列没有根据checkbox的值来确定是否选中
背景: 昨天帮朋友做一个easyui datagrid的小实例时,才发现easyui datagrid的checkbox列,没有根据值为true或false来选中checkbox,当时感觉太让人失 ...
- easyui datagrid显示进度条控制操作
在当我们需要控制时间前台实际项目页面datagrid显示进度条的数据加载时运行,和datagrid默认情况下只在有url加载运行时的数据显示方式的进度条.下面的代码手动控制: 打开一个进度条: $(' ...
- 【转】让浏览器格式化显示JSON数据之chrome jsonView插件安装
jsonView 用来让Chrome浏览器能格式化的显示JSON数据. 以上是网上找的方式,且试验成功! 步骤: 1.打开 https://github.com : 2.搜索 jsonView 链接: ...
- Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板
很久没有写博客了,这段时间比较忙,又是搬家又是做自己的项目,还有太多琐碎的事情缠身,好不容易抽出时间把最近自己做的一些简单例子记录一下. 在我的项目中,我需要一个显示面板来显示游戏中的一个三维数据,例 ...
随机推荐
- [Java]通过java获取计算机名
通过java获取计算机名 String hostname = "Unknown"; try { InetAddress addr; addr = InetAddress.getLo ...
- Under-sampling
Under sampling When the signal frequency is high, and the tester frequency can’t catch the signal ...
- SQLServer函数 left()、charindex()、stuff()的使用
1.left() LEFT (<character_expression>, <integer_expression>) 返回character_expression 左起 ...
- 【译】微型ORM:PetaPoco【不完整的翻译】(转)
出处:http://www.cnblogs.com/youring2/archive/2012/06/04/2532130.html PetaPoco是一款适用于.Net 和Mono的微小.快速.单文 ...
- 在Word 中撰写并发布到博客的帮助
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- SpringMVC源码解析 - HandlerAdapter - @SessionAttributes注解处理
使用SpringMVC开发时,可以使用@SessionAttributes注解缓存信息.这样业务开发时,就不需要一次次手动操作session保存,读数据. @Controller @RequestMa ...
- SpringMVC源码解读 - HandlerMapping
SpringMVC在请求到handler处理器的分发这步是通过HandlerMapping模块解决的.handlerMapping 还处理拦截器. 先看看HandlerMapping的继承树吧 可以大 ...
- JAVA内存管理再解
首先我们要明白一点,我们所使用的变量就是一块一块的内存空间!! 一.内存管理原理: 在java中,有java程序.虚拟机.操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统间交 ...
- Summary #ToBeContinue......
一.请回望暑假时的第一次作业,你对于软件工程课程的想象1)对比开篇博客你对课程目标和期待,“希望通过实践锻炼,增强计算机专业的能力和就业竞争力”,对比目前的所学所练所得,在哪些方面达到了你的期待和目标 ...
- 机器学习—集成学习(GBDT)
一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...