虚模式填充常用来处理大量数据,某个字段的显示问题。

DataGridView是.net 2.0新增的表格数据编辑和显示控件,简单的数据显示和编辑,只需直接和数据源绑定就可以了。 
对于 一些特殊情况,我们需要自己填充DataGridView,这时候只需要按照行列顺序,首先获得行,然后通过行的Cells属性,得到单元格,设置其 Value属性即可。但这种模式有个问题,即对于几十行或者几百行的数据,显示效率不是问题,当数据量逐渐增大时,效率就成了一个非常重要的问题。 
那么,如何解决这样的问题呢,写过或者看过类似Grid控件的朋友一定会想到,按需加载数据。也就是当我们在数据表格中移动时,显示到屏幕上的数据只是实际 需要的数据的一部分,那么,只加载这部分数据即可。而对于DataGridView,一切都准备好了,只要我们开启VirtualMode,然后实现几个 事件(用于加载保存数据),其他的事情DataGridView会替我们做好。 
在WinForm窗体中添加一个DataGridView控件,设置VirtualMode属性为True。

CellValueNeeded,该事件在控件刷新,需要为单元格填充数据时发生,其参数e返回当前单元格的行和列,根据行和列,获取需要的值,赋给e的Value属性。 
如果只是显示数据,该事件已足够,从理论上,通过这样的方法,DataGridView显示的数据与数据量无关,即使数据量再大,也可以在常数时间内完成刷新。

-------------------------以上内容引用自:https://blog.csdn.net/qq_30122639/article/details/53739607---------------------------------------------------------------------------

CellValueNeeded事件触发有两个条件:

1、datagridview的VirtualMode属性要设置为true

2、datagridview的CellValueNeeded事件要触发必须datagridview的列是非绑定列(即不能设置datagridview的DataPropertyName属性),并且这个列必须可见

===============================================================================

方法使用事例

private void dgvRequisitionDetail_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (e.RowIndex < ) return;
DataView dv = (DataView)dgvRequisitionDetail.DataSource;
if (dv == null) return;
// RequisitionStatus:请领单状态:0 待审核,1已通过,2未通过,3,已完成(已出库)
if (e.ColumnIndex == CStatus.Index)
{
int status = DbHelper.GetInt(dv[e.RowIndex], "status");
if ((status == (int)RequisitionStatus.TO_AUDIT))
e.Value = CConst.SetRequisitionStatus(RequisitionStatus.TO_AUDIT);
if ((status == (int)RequisitionStatus.NOTPASS))
e.Value = CConst.SetRequisitionStatus(RequisitionStatus.NOTPASS);
if ((status == (int)RequisitionStatus.FINISHED))
e.Value = CConst.SetRequisitionStatus(RequisitionStatus.FINISHED);
if ((status == (int)RequisitionStatus.AUDITED))
e.Value = CConst.SetRequisitionStatus(RequisitionStatus.AUDITED);
int flag = DbHelper.GetInt(dv[e.RowIndex], "flag");
if (flag == (int)StockNumAndRequisitionNumEnum.STOCKNUM_LACK)//库存数量<请领数量
{
dgvRequisitionDetail.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Tomato;
}
if (flag == (int)StockNumAndRequisitionNumEnum.STOCKNUM_ENOUGH)//库存数量>=请领数量
{
dgvRequisitionDetail.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGreen;
}
}
}

效果图

winform DataGridView的虚模式填充,CellValueNeeded事件的触发条件的更多相关文章

  1. input的onchange事件实际触发条件与解决方法

    input中onchange事件已经属于元老级别了,并且现在同onclick一样使用频率很高,然而onchange的机制实际上有很多童鞋并不清楚,我们通过实例来分析这个事件的特征. 触发onchang ...

  2. laravel 模型事件 updated 触发条件

    1. 只有 $sku->{attribute} != $sku->getOriginal({attribute}) 不一致的时候才会触发 getDirty() 不为空的时候才触发, 而且不 ...

  3. #.NET# DataGrid显示大量数据——DataGridView虚模式

    要解决的目标:如何让 Datagridview 快速平滑显示大量数据 通常,Winform 下的表格控件是很"低效"的,如 DataGrid 和 DataGridView.造成低效 ...

  4. 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异

    转载:http://www.w3help.org/zh-cn/causes/BX2047 标准参考 无. 问题描述 一般情况下,onbeforeunload 事件处理函数内会写入一些提示性语句,当用户 ...

  5. [Winform] DataGridView 总结(FAQ)

    Q1.  如何使单元格不可编辑? A:设置 ReadOnly 属性,可以设置的对象包括 DataGridViewRow(行).DataGridViewColumn(列).DataGridViewCel ...

  6. C# winform DataGridView 常见属性

    C# winform DataGridView 属性说明① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤ 行的用户删除操作的自定义 ⑥ 行.列的隐藏和删 ...

  7. 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案

    上周在开发Winform 项目中,我曾遇到一个看似简单,但一直都没有解决的问题,那就是:设置winform DataGridView控件的行DefaultCellStyle,但却没有任何变化,我也曾求 ...

  8. 告诉你吧,一套皮肤在winform与wpf开发模式下实现的界面效果同样精彩,winform界面和wpf界面。

    一.同一资源: 二.先上软件界面: (1)wpf界面: 在wpf中实现这样类似web风格的软件界面就不用我多说了,在wpf实现这样的风格是很简单的,完全像网页设计一样的. (2)winform界面 在 ...

  9. winform DataGridView控件开发经验

    1.不让DataGridView控件自动生成列 设置AutoGenerateColumns 为false. dgTicket.AutoGenerateColumns = false; //将自动生成列 ...

随机推荐

  1. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

  2. 关于vsftp出现Restarting vsftpd (via systemctl): Job for vsftpd.service failed because the control 的解决办法

    转载于:http://blog.csdn.net/it_dream_er/article/details/50783111 刚刚在搭建ftp服务器时,在配置好一切的参数之后,在我重启时,出现了无法启动 ...

  3. 如何保存android app日志

    android 手机日志保存方法如下: 前置条件:已安装adb 1,手机usb连接电脑,打开USB调试模式(注意仅连接一台手机设备) 2,win+R输入cmd打开命令窗口,输入指令:adb devic ...

  4. python 类和对象下

    类的常用函数 issubclass() 检测一个类是否是另外一个类的子类 格式1:issubclass(被检测类,父类) 返回值:布尔值 格式1:issubclass(被检测类,(父类1,父类2,父类 ...

  5. Python中单下划线和双下划线

    1.双下划线开头和结尾 Python中存在一些特殊的方法,有些方法以双下划线 “__” 开头和结尾,它们是Python的魔法函数,比如__init__()和__str__等等.不用要这种方式命名自己的 ...

  6. MongoDB Windows之ZIP安装

    下载.下载地址同MSI下载地址:https://www.mongodb.com/download-center/community .Package选择Zip. 下载完成后解压到对应文件夹,该文件夹就 ...

  7. Intellij Idea乱码解决方案都在这里了

    乱码场景 使用Intellij Idea经常遇到乱码问题,可以总结为以下几类乱码的场景. 1.工程代码乱码. 2.main方法运行,控制台乱码. 3.tomcat运行,控制台乱码. 解决方案 1.工程 ...

  8. spring boot 多环境(dev、test、prod)配置文件---命令行切换

    properties配置格式 在Spring boot 中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对于你的环境标识,比如: ...

  9. js 模拟window.open 打开新窗口

    为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...

  10. 点击td对同行的其他td进行操作

    假设有这样的一段tr: <tr> <td><input type="checkbox" name="item" class=&qu ...