DataGridView的虚模式填充
来源:互联网 发布:索尼网络电视机 编辑:程序博客网 时间:2024/05/18 14:12
系统中需要使用到了DataGridView控件来显示数据,采用了最简单和常用的逐行填充法,运行没问题,但是在大数据量的时候显示速度非常慢,考虑到系统使用场景中的数据量通常都在百万行以上,所以只能尝试使用虚模式(VirtualMode)来填充。
查看了MSDN里的资料,发现使用虚模式好像挺简单的,只要将DataGridView的VirtualMode属性设置为true,然后完成CellValueNeeded事件的处理代码就行。如果需要编辑数据的话,还需要自己处理CellValuePushed事件。
- //创建编号列
- DataGridViewColumn numcol = new DataGridViewTextBoxColumn();
- numcol.Name = NumberColName;
- numcol.HeaderText = NumberColName;
- numcol.DefaultCellStyle.BackColor = Color.FromArgb(212, 208, 200);
- numcol.SortMode = DataGridViewColumnSortMode.Programmatic;
- numcol.ReadOnly = true;
- numcol.Tag = false;
- dataGridView.Columns.Add(numcol);
- soFieldInfos osmFieldInfos = oRst.GetFieldInfos();
- for (int i = 1; i <= osmFieldInfos.Count; i++)
- {
- soFieldInfo osmField = osmFieldInfos[i];
- string columnTitle = osmField.Name;
- if (!string.IsNullOrEmpty(osmField.Caption))
- columnTitle = osmField.Caption;
- DataGridViewColumn col = new DataGridViewTextBoxColumn();
- col.Name = osmField.Name;
- col.HeaderText = columnTitle;
- dataGridView.Columns.Add(col);
- }
- suSuperMap.ReleaseSmComObject(osmFieldInfos);
- osmFieldInfos = null;
- //采用虚模式来填充数据
- dataGridView.VirtualMode = true;
- dataGridView.RowCount = oRst.RecordCount + 1;
- }
- <p align="left">//单元格填充数据事件
- void dataGridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
- {
- // If this is the row for new records, no values are needed.
- if (e.RowIndex == this.dataGridView.RowCount)
- return;
- // 从记录集中读取数据
- string colName = this.dataGridView.Columns[e.ColumnIndex].Name;
- if (colName.Equals(NumberColName))
- {
- e.Value = e.RowIndex + 1;
- }
- else
- {
- oRst.MoveTo(e.RowIndex + 1);
- e.Value = oRst.GetFieldValueText(colName);
- }
- } </p>
编译运行之后,果然显示速度非常快,用户根本无法察觉它的填充时间,这是因为虚模式只填充当前窗口中需要显示的那一小部分数据,实时根据滚动条位置刷新数据,并不是像逐条填充和数据源绑定时一次性将数据填充完成再显示,速度差距自然不能同日而语。
但发现有个问题:数据列表的最后一行空行一直在显示。这一行是控件本身提供的新增编辑行,便于用户增加新数据。但我系统中只用来编辑数据,并不新增和删除数据,该怎么去掉呢?
首先想到的是设置成禁止用户追加新行:
- this.dataGridView.AllowUserToAddRows = false;
运行后没有效果,可能是因为虚模式所致。
然后想到将DataGridView的行数减少一行,只显示现有的数据行,不显示新增行。
将dataGridView.RowCount = oRst.RecordCount + 1;修改成dataGridView.RowCount = oRst.RecordCount;
再次运行后发现,末尾的新增编辑行依然存在,而本来应显示的数据却少了一行。
从MSDN中找到关于这一行的说明,里面有关于末尾行的解释,说这一新增编辑行的在VirtualMode下无法控制,如果设置该行的Visible属性为false,还会引发不支持的操作异常。带着试试看的心态,决定试一试,于是修改单元格数据的填充事件:
- <p align="left">// If this is the row for new records, no values are needed.
- if (e.RowIndex >= this.dataGridView.RowCount - 1)
- {
- this.dataGridView.Rows[e.RowIndex].Visible = false;
- return;
- } </p>
想不到,这一改居然就真的不显示了,而且操作上也没有出现MSDN上所说的异常,不禁大喜。
可没高兴多久,发现当要显示的数据源记录为0条时,即数据本身为空时,出现了MSDN所说的“不支持的操作”的异常,这才发现原来MSDN是不跟程序员开玩笑的:)。
于是只好加个判断,如果当前数据源本身就为空,则这一末尾行显示,否则就隐藏:
- <p align="left">// If this is the row for new records, no values are needed.
- if (e.RowIndex >= this.dataGridView.RowCount - 1)
- {
- this.dataGridView.Rows[e.RowIndex].Visible = e.RowIndex == 0 ? true : false;
- return;
- } </p>
这下不会出异常了,但是数据源为空的时候,会显示一行孤零零的空白数据,还是觉得有些看不顺眼。
过了几天,突然想起,可不可以在设置控件的行数(RowCount)的地方再加个判断呢?
于是在设置行数的地方也加个判断:
- <p>//采用虚模式来填充数据
- dataGridView.VirtualMode = true;
- int recordCount = oRst.RecordCount;
- dataGridView.RowCount = recordCount == 0 ? 0 : recordCount + 1;</p>
现在,终于不会出现恼人的末尾多一个空白行的情况了,系统运行也正常。但是心底还是有点儿不甘,有没有爽快和更合适的解决方法呢?
BTW,使用虚模式填充时,DataGridView的SortMode设置成自动排序模式Automatic无效,只能自己实现排序功能。而且由于虚模式是实时地填充数据,排序功能的实现其实是对数据源的排序。
- DataGridView的虚模式填充
- DataGridView的虚模式填充
- DataGridView的虚模式填充
- DataGridView的虚模式填充
- DataGridView的虚模式填充(大数据的填充)
- 填充DataGridView
- DataGridView 虚模式
- 填充DataGridView方法
- DataGridView填充单元格颜色
- RSA加密的填充模式
- RSA加密的填充模式
- UIView的图像填充模式
- iOS ImageView 的填充模式
- IOS Swift UIImageView图片的填充模式
- C#的DataGridView中,设置固定的列宽,自动填充宽度
- 不绑定DataSet.Tables,而是一行一行的读取DataSet中的数据并填充到DataGridView中
- datagridview用虚模式展示大量数据。
- 求datagridview一行一行填充数据,图片
- Effective C++ 学记之20 宁以pass-by-reference-to-const 替换 pass-by-value
- ScrollView和ListView、GridView冲突解决
- Hibernate3.X—HelloWorld篇(入门篇)
- 方法与设计
- Redis + Jedis + Spring
- DataGridView的虚模式填充
- Fab CEO:我在创办4家公司中学到的90件事
- Android安卓Tabhost,TabActivity重影,残留破问题
- 如何写软件项目计划
- WP-首页缩略图效果
- 用C#创建Windows服务(Windows Services) 转自:http://www.cnblogs.com/caca/archive/2005/02/25/109028.html
- oracle学习笔记之数据查询
- usleep 和 sleep
- NSObject类所支持的一些基本方法