#.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 的,不使用反射无法访问。

原文地址:https://www.cnblogs.com/cinlap/p/9864013.html

时间: 2024-11-10 06:08:39

#.NET# DataGrid显示大量数据——DataGridView虚模式的相关文章

winform DataGridView的虚模式填充,CellValueNeeded事件的触发条件

虚模式填充常用来处理大量数据,某个字段的显示问题. DataGridView是.net 2.0新增的表格数据编辑和显示控件,简单的数据显示和编辑,只需直接和数据源绑定就可以了. 对于 一些特殊情况,我们需要自己填充DataGridView,这时候只需要按照行列顺序,首先获得行,然后通过行的Cells属性,得到单元格,设置其 Value属性即可.但这种模式有个问题,即对于几十行或者几百行的数据,显示效率不是问题,当数据量逐渐增大时,效率就成了一个非常重要的问题. 那么,如何解决这样的问题呢,写过或

JQuery EasyUI 学习——Struts2与EasyUI DataGrid数据表格结合使用显示数据库数据

因为EasyUI DataGrid只要取出后台传过来的一定格式的JSON数据,就可以在前台页面数据表格中,以一定形式显示数据库中的数据.此处,我们使用Struts2框架整合DataGrid,实现数据的显示. 一.页面内容 为了在页面中显示数据库中字段内容,需要定义一个table,通过EasyUI内部设计,自动显示数据,如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF

Linechart + Datagrid 互动展示数据 (Linechart自定义数据点选择线)

如上图示,在linechart中添加红色Y线,拖动该线的过程中,经过数据点时,会实时更新datagrid中对应的X.Y值数据. 实现要点: 1.linechart添加Y线 继承mx.charts.chartClasses.ChartElement,自定义Y线. package { import flash.display.Graphics; import flash.geom.Point; import flash.text.TextField; import mx.charts.chartCl

[转]6种常见的数据加载模式设计

原文链接:http://elya.cc/2014/03/31/loading/ 设计师在进行APP设计的设计时,往往会更加专注于界面长什么样,界面和界面之间怎么跳转,给予用户什么样的操作反馈,却偏偏特别容易忽略掉一个比较重要的环节,就是APP数据加载中的设计,所以会导致我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以轻松自在的享受等待,对加载后的

拓扑学——探寻大数据的内在模式

拓扑学——探寻大数据的内在模式 点击上方“大数据文摘”可以订阅哦! 大数据文摘作品,欢迎个人转发朋友圈:其他机构.自媒体转载,务必后台留言,申请授权. 作者:Kevin Knudson编译:数码叮叮 校对:于丽君,康欣 编辑:Ivy 如果我们不能明白如何分析它,这些数据有什么好? 大数据正被媒体.工业和政府所瞩目.公司和实验室不停地产生大量的数据,从气象资料到携带电话的使用到医疗记录,与每件事相关.而每一套数据又和成百个变量相关. 这些数据量之大.规模之复杂,用传统的方式来寻找数据之间的模式已不

大数据架构和模式(一)——大数据分类和架构简介

概述 大数据可通过许多方式来存储.获取.处理和分析.每个大数据来源都有不同的特征,包括数据的频率.量.速度.类型和真实性.处理并存储大数据时,会涉及到更多维度,比如治理.安全性和策略.选择一种架构并构建合适的大数据解决方案极具挑战,因为需要考虑非常多的因素. 这个 “大数据架构和模式” 系列提供了一种结构化和基于模式的方法来简化定义完整的大数据架构的任务.因为评估一个业务场景是否存在大数据问题很重要,所以我们包含了一些线索来帮助确定哪些业务问题适合采用大数据解决方案. 从分类大数据到选择大数据解

大数据架构和模式(三)——理解大数据解决方案的架构层

摘要:大数据解决方案的逻辑层可以帮助定义和分类各个必要的组件,大数据解决方案需要使用这些组件来满足给定业务案例的功能性和非功能性需求.这些逻辑层列出了大数据解决方案的关键组件,包括从各种数据源获取数据的位置,以及向需要洞察的流程.设备和人员提供业务洞察所需的分析. 概述 这个 “大数据架构和模式” 系列的 第 2 部分 介绍了一种评估大数据解决方案可行性的基于维度的方法.如果您已经使用上一篇文章中的问题和提示分析了自己的情况,并且已经决定开始构建新的(或更新现有的)大数据解决方案,那么下一步就是

6种常见的数据加载模式设计

设计师在进行APP设计的设计时,往往会更加专注于界面长什么样,界面和界面之间怎么跳转,给予用户什么样的操作反馈,却偏偏特别容易忽略掉一个比较重要的环节,就是APP数据加载中的设计,所以会导致我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以轻松自在的享受等待,对加载后的内容有明确的预期呢? 今天这篇文章,会介绍6种常见的加载模式设计,和3种减少等待

大数据架构和模式(五)——对大数据问题应用解决方案模式并选择实现它的产品

摘要:本文使用了一个基于场景的方法,概述了可能有助于定义大数据解决方案的解决方案模式.每个场景都从一个业务问题开始,并说明为什么需要大数据解决方案.本文会将一个具体的解决方案模式(由原子模式和复合模式组成)应用到业务场景.这个逐步分析的方法有助于用户确定解决方案所需的组件.在文章的末尾,提供了一些建议使用的典型产品和工具. 简介 本系列的 第 3 部分 描述了针对最常见的.经常发生的大数据问题及其解决方案的原子模式和复合模式.本文将推荐可以用于架构大数据解决方案的三个解决方案模式.每个解决方案模