C#的DatagridView控件在数据量过大时加载过慢

星悬_月 2014-12-06 02:54:22
小弟目前在做一个数据检索界面,界面首次加载时数据量挺大,越2w条记录,看了有网友说要开启VirtualMode,我就尝试了一下,把从数据库查到的数据放到DataTable中,然后写了CellValueNeeded事件,现在加载约10s可以搞定,但是问题来了:使用VirtualMode初始化时,dgvQueryResult.RowCount = dt.Rows.Count; 但查询条件变了后,dt变了,CellValueNeeded事件就不好使了。CellValueNeeded事件是这样写的,请各位大神帮我指点一下,这个事件要怎么写才能满足不同的查询要求。或者说我哪些地方还没考虑到,请大家指点一下,谢谢!
private void dgvQueryResult_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (e.RowIndex == dt.Rows .Count )
return;
e.Value = dt.Rows[e.RowIndex][e.ColumnIndex].ToString();
}
...全文
2110 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
software_artisan 2014-12-07
  • 打赏
  • 举报
回复
必须加日期树啊,左树右表的形式!让用户点日期才给加载那一天的数据,3000条就不会慢了,然后加关键字定位或关键字筛选就ok,具体用定位还是筛选看情况。
software_artisan 2014-12-07
  • 打赏
  • 举报
回复
关键不在快慢,是怎么找要看的数据啊?你回头做出来了,客户必然还要你改。我说的这两个方法是解决这类需求的常规方法。树和表结合解决的数据量的问题,而且不管客户要哪一天的都行,不仅仅是1周,万一哪天要看1个月前的数据呢?定位或筛选,简单地说就是解决查询的问题,数据超过30条,基本就需要查询了。没有查询根本找不到数据好吧。
星悬_月 2014-12-07
  • 打赏
  • 举报
回复
引用 12 楼 xuanbg 的回复:
必须加日期树啊,左树右表的形式!让用户点日期才给加载那一天的数据,3000条就不会慢了,然后加关键字定位或关键字筛选就ok,具体用定位还是筛选看情况。
我现在用的是虚模式,加载10000条大概10s,还能忍,而且加载这么多条的情况很少出现,就这样凑活了。
失落的神庙 2014-12-06
  • 打赏
  • 举报
回复
那就分页咯。
星悬_月 2014-12-06
  • 打赏
  • 举报
回复
我现在出去有点事,晚上回来再看各位大神的回复!
星悬_月 2014-12-06
  • 打赏
  • 举报
回复
引用 7 楼 wawd74520 的回复:
引用 6 楼 u012441819 的回复:
[quote=引用 5 楼 capry0518 的回复:] 使用分页控件让用户看完一百条以后点击下一页按钮,你表格每次只显示一百条
这的确可以,其实我就是想进一步了解virtualmode的使用,我现在还是不清楚CellValueNeeded具体是怎么工作的,dt变化后为什么不能正常显示。
dt变化后 datagridview.datasource=null; datagridview.datasource=dt; 就行了。[/quote]不行哦,因为我之前就没绑定数据源,是用CellValueNeeded事件进行绘制的。
失落的神庙 2014-12-06
  • 打赏
  • 举报
回复
引用 6 楼 u012441819 的回复:
引用 5 楼 capry0518 的回复:
使用分页控件让用户看完一百条以后点击下一页按钮,你表格每次只显示一百条
这的确可以,其实我就是想进一步了解virtualmode的使用,我现在还是不清楚CellValueNeeded具体是怎么工作的,dt变化后为什么不能正常显示。
dt变化后 datagridview.datasource=null; datagridview.datasource=dt; 就行了。
星悬_月 2014-12-06
  • 打赏
  • 举报
回复
引用 5 楼 capry0518 的回复:
使用分页控件让用户看完一百条以后点击下一页按钮,你表格每次只显示一百条
这的确可以,其实我就是想进一步了解virtualmode的使用,我现在还是不清楚CellValueNeeded具体是怎么工作的,dt变化后为什么不能正常显示。
capry0518 2014-12-06
  • 打赏
  • 举报
回复
使用分页控件让用户看完一百条以后点击下一页按钮,你表格每次只显示一百条
星悬_月 2014-12-06
  • 打赏
  • 举报
回复
引用 3 楼 wawd74520 的回复:
用datatable dt写好数据后 直接 datagridview.datasource=dt
额,直接=dt的话2w条大概加载了2分钟,简直不能忍。。。
失落的神庙 2014-12-06
  • 打赏
  • 举报
回复
用datatable dt写好数据后 直接 datagridview.datasource=dt
星悬_月 2014-12-06
  • 打赏
  • 举报
回复
引用 1 楼 junzhang4008 的回复:
......上来就弄2w条记录。。。。 软件是给人用的。2w条谁闲着没事一个个看啊。 你弄出前几页就行了。
不行啊,即使是3天的数据量也有1w条,客户还要求1周,烦死了,明明他们不看。
  • 打赏
  • 举报
回复
......上来就弄2w条记录。。。。 软件是给人用的。2w条谁闲着没事一个个看啊。 你弄出前几页就行了。
本文档不准备面面俱到地介绍DataGridView,而是着眼于深入地介绍一些技术点的高级特性。 本文档按逻辑分为5个章节,首先是结构和特性的概览,其次是内置的列/单元格类型的介绍,再次是数据操作相关的内容,然后是主要特性的综述,最后是最佳实践。 大部分章节含有一个“Q & A”部分,来回答该章节相关的一些常见问题。注意,某些问题会由于知识点的关联性重复出现在多个章节。这些问题、答案及其附带的示例代码都包含在本文档的附录部分。 一、DataGridView技术点的高级特性。 11 1 何为DataGridView 11 1.1 DataGridView和DataGrid 之间的区别 11 1.2 DataGridView的亮点 12 2 DataGridView的结构 13 2.1 结构元素(Architecture Elements) 13 2.2 单元格和组(Cells and Bands) 13 2.3 DataGridView的单元格 (DataGridViewCell) 13 2.3.1 DataGridViewCell的工作机制 14 2.3.2 常见问题 15 2.4 DataGridView的列(DataGridViewColumn) 16 2.5 DataGridView的编辑控件(Editing Controls) 16 2.6 DataGridViewRow 17 2.6.1 常见问题 17 3 列/单元格类型揭密(column/cell types) 17 3.1 DataGridViewTextBoxColumn 18 3.2 DataGridViewCheckBoxColumn 19 3.3 DataGridViewImageColumn 19 3.4 DataGridViewButtonColumn 19 3.5 DataGridViewComboBoxColumn 20 3.5.1 DataError事件和ComboBox列 20 3.5.2 常见问题 20 3.6 DataGridViewLinkColumn 21 4 操作数据(Working with Data) 21 4.1 数据输入和验证的相关事件 21 4.1.1 数据验证相关事件的顺序 21 4.1.2 验证数据 22 4.1.3 在新行中的数据输入(Data Entry in the New Row) 22 4.1.3.1 显示新行 22 4.1.3.2 为生成的新行添加默认值 22 4.1.3.4 在新行中输入数据 23 4.1.3.5 自定义新行的可视化效果 23 4.1.3.6 新行的排序 24 4.1.3.7 关于新行,还要注意: 24 4.1.3.8 Virtual Mode下的新行 24 4.2 关于Null值 24 4.2.1 NullValue属性 24 4.2.2 DataSourceNullValue属性 25 4.3 DataError事件 25 4.4 数据绑定模式(Databound modes) 26 4.4.1 非绑定模式(Unbound Mode) 26 4.4.2 绑定模式(Bound Mode) 26 4.4.2.1 有效的数据源 27 4.4.3 虚拟模式 27 4.4.4 混合模式 – 绑定与非绑定模式 27 4.4.5 常见问题 28 5 特性综览(Overview of features) 28 5.1 样式(Styling) 28 5.1.1 The DataGridViewCellStyle Class 29 5.1.2 Using DataGridViewCellStyle Objects 29 5.1.3 Style Inheritance 30 5.1.4 Setting Styles Dynamically 34 5.2 Custom painting 35 5.2.1 Paint Parts 35 5.3.1 在Windows窗体DataGridView控件调整大小选项 39 5.3.2 Resizing with the Mouse用鼠标调整大小 42 5.3.3 Automatic Sizing自动调整大小 43 5.3.4 Programmatic Resizing编程调整大小 45 5.3.5 Customizing Content-based Sizing Behavior自定义基于内容的调整大小行为 46 5.3.6 Content-based Sizing Options基于内容的调整大小选项 47 5.4 Selection modes选择模式 47 5.4.1 Programmatic Selection编程选择 49 5.5 滚动(Scrolling) 49 5.5.1 Scroll event Scroll事件 49 5.5.2 Scroll bars滚动条 50 5.5.3 Scrolling Properties滚动属性 50 5.6 Sorting排序 50 5.6.1 Programmatic Sorting编程排序 52 5.6.2 Custom Sorting自定义排序 53 5.6.3 Common questions and scenarios常见问题及案例 54 5.7 Border styles边框样式 55 5.7.1 Standard Border Styles标准边框样式 55 5.7.2 Advanced Border Styles高级边框风格 56 5.8 Enter-Edit modes输入,编辑模式 57 5.9 Clipboard copy modes剪贴板拷贝模式 58 5.10 Frozen columns/rows冻结的列/行 60 5.11 Implementing Custom cells and editing controls/cells实现自定义和编辑控制单元格/单元格 60 5.11.1 IDataGridViewEditingControl 接口 61 5.11.2 IDataGridViewEditingCell 接口 61 5.12 Virtual mode虚拟模式 61 5.12.1 Bound Mode and Virtual Mode绑定模式和虚拟模式 62 5.12.2 Supplementing Bound Mode补充绑定模式 62 5.12.3 Common questions and scenarios常见问题及案例 62 5.12.4 Replacing Bound Mode更换绑定模式 63 5.12.5 Virtual-Mode Events虚拟模式事件 63 5.12.6 Best Practices in Virtual Mode在虚拟模式下的最佳实践 66 5.13 容量(Capacity) 66 6 最佳实践(Best Practices) 67 6.1 Using Cell Styles Efficiently使用高效单元格样式 67 6.2 Using Shortcut Menus Efficiently使用高效快捷菜单 68 6.3 Using Automatic Resizing Efficiently使用自动调整大小高效 69 6.4 Using the Selected Cells, Rows, and Columns Collections Efficiently高效使用选定的单元格,行和列的集合 69 6.5 Using Shared Rows 使用共享行 70 6.6 Preventing Rows from Becoming Unshared 防止行成为非共享 72 附录 A – FAQ 75 1. 如何使指定的单元格不可编辑? 75 2. 如何让一个单元格不可用(disable)? 75 3. 如何避免用户将焦点设置到指定的单元格? 77 4. 如何使所有单元格总是显示控件(不论它是否处于编辑状态)? 77 5. Why does the cell text show up with “square” characters where they should be new lines(TODO,未能实现该效果)? 78 6. 如何在单元格内同显示图标和文本? 78 7. 如何隐藏一列? 80 8. 如何避免用户对列排序? 81 9. 如何针对多个列排序? 81 9.1 将数据绑定到DataGridView 81 9.2 Unbound DataGridView 取消绑定 82 9.2.1 Custom Sorting Using the SortCompare Event 使用排序结束间实现用户自定义排序 82 9.2.2 Custom Sorting Using the IComparer Interface使用IComparer接口实现自定义排序 84 10. 如何为编辑控件添加事件处理函数? 86 11. 应在何移除编辑控件的事件处理函数? 87 12. 如何处理ComboBox列中控件的SelectIndexChanged事件? 87 13. 如何通过拖放调整行的顺序? 87 14. 如何调整最后一列的宽度使其占据网格的剩余客户区? 89 15. 如何让TextBox类型的单元格支持换行? 89 16. 如何使Image列不显示任何图像(字段值为null)? 90 17. 如何能够在ComboBox类型的单元格中输入数据? 90 18. How do I have a combo box column display a sub set of data based upon the value of a different combo box column(TODO)? 91 19. 如何在用户编辑控件候(而不是在验证)就显示错误图标? 92 20. 如何同显示绑定数据和非绑定数据? 94 21. How do I show data that comes from two tables(TODO)?如何显示来自两个数据源的数据? 96 22. 如何显示主从表? 97 23. 如何在同一DataGridView中显示主从表? 99 24. 如何避免用户对列排序? 99 25. 如何在点击工具栏按钮的候将数据提交到数据库? 99 26. 如何在用户删除记录显示确认对话框? 99
DataGridView打印控件和.NET轻松打印控件5.0版(含报表模板设计组件)2012年5月12日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB、C#等都可以用),有帮助文档与使用实例。 与4.95版相比,控件5.0版的主要更改如下: 1、解决了生成预览及打印过程中的状态窗口中显示的“第 页共 页”问题,现在可以正确显示总页数。 2、增加了打印DataGridView中选定内容(选定行、列或矩形区域)的功能。对DGVPrint组件,设置PrintRange属性为相应的值即可,而对于VB2008Print组件,请先用CopyDataGridViewSelectedRange函数将要打印的DGV复制到新的DGV,然后再用PrintDGV函数打印这个新DGV即可。 3、增加了大量的绘图函数(如路径、多边形、填充多边形、曲线等),基本上.NET的GDI+绘图函数都有了(注意,填充类绘图函数名称为DrawFill……,而不是GDI+的Fill…。另外,对于Brush参数,只支持SolidBrush、TextureBrush、LinearGradientBrush三种类型的画刷,而且对于后2个画刷,只支持其中的主要属性。 4、增加了直接打印Panel、GroupBox等容器控件中的内容的DrawPanel函数(对容器中的TextBox控件与Label控件以文本的形式打印,除此之外的其他除容器控件之外的控件如CheckBox、ComboBox、Button控件等则直接以图片的形式打印,函数还支持嵌套容器控件的打印,且如果一页打印不下具有自动换页续打功能)。借助该函数的功能,您可以在Panel等容器控件中设计好要打印的内容及打印相对位置,控件轻松帮助您解决打印问题。(参见演示实例) 5、增加了报表文件及模板文件的自动关联功能。在运行了“打印控件安装.msi”文件安装了打印控件的前提下,双击报表文件(扩展名为you的文件)即可打印预览该报表的内容;双击报表模板文件(扩展名为mb的文件)即可进入报表模板修改界面(此如果打印预览报表模板不会有数据,因为这样修改报表模板是没有设置数据源的)。 6、解决了原EasyReport报表组件由于资源释放不及,在多次重复使用占用大量句柄而可能产生的不能打印或预览问题。 7、解决了DataGridView在有固定列(冻结列)的候,有些情况下(DGV固定列的index与DisplayIndex不一致)打印可能出错的问题。 8、DGVPrint组件的自定义纸张使用更方便,设计在可以通过设置PaperHeight与PaperWidth属性设置,运行在“打印参数”设置窗口中也可设置自定义纸张大小。 9、解决了EasyReport组件“页表头”区域设置的背景图片覆盖该区域打印内容的问题。 10、增加了打印XML格式的HTML文档的功能(目前只支持部分HTML标记,不支持表格及图片等标记,请参见DrawXML函数) 11、对帮助文件做了进一步的修订 12、增加了很多新的演示实例。 13、其他一些完善和修改。 本控件特色: 1、强大的DataGridView打印功能,不仅可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DataGridView表格,基本上能完全按DataGridView控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,如果您在使用调整了列的顺序,刷新打印后就会按调整后的列显示顺序进行打印,基本上做到了所见即所得的打印。 2、报表设计功能,这是4.7版控件的新增功能。报表模板设计组件EasyReport与WebEasyReport组件可以设计普通报表、分组报表、套打模板等,分别以DataGridView和GridView为数据源。控件的位置以毫米为计量单位,定位准确,很适合套打单据设计。 3、分组汇总打印DataGridVeiw功能,每组还可以自动换新页打印,还可以自动增加行号。 4、强大的文本打印输出功能,有多个文本打印重载函数,打印文本,如果需要,控件会自动换行或换页打印输出。 5、支持同一文档多种版面格式打印(类似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页在NewPage方法中指定要使用的页面格式即可,使用非常简单。 6、报表文件保存功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表的打印内容。 7、打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或都从保存的打印方案文件中读取打印参数。 8、水印
控件可以在Visual Studio系列的开发环境下使用,支持C/S结构的应用程序,也支持B/S结构的应用程序。实现Web环境下的打印预览。本控件提供大量的属性与方法,可以处理文本信息,图形信息、表格信息的打印预览功能,在应用程序的开发过程中可以对Visual Studio环境下的各种表格控件进行直接的打印预览,方便数据信息的预览与打印。 文本信息:处理各种文字信息,主要分标题信息、普通文字信息、文字段落信息,根据当前坐标位置显示各种样式的文字信息,自定义文字的样式与颜色、字体大小。可以满足各种复杂的文档效果的打印预览。 图形信息:处理各种图形信息,主要有直线、矩形(圆形、椭圆形)、填充颜色矩形(圆形、椭圆形)、图片。根据当前坐标位置显示各种样式的图形信息,自定义图形的样式、颜色、图形大小。在指定位置显示应用程序中的图片控件。 表格信息:主要分两种,一种是用户自定义表格信息,另一种是Visual Studio环境下的各种表格控件信息。两种表格信息显示的方法不同,显示的途径不同,对于普通表格显示没有什么区别,但处理复杂表格会进行区分。对于用于自定义表格信息是根据用户的要求进行每个单元格的绘制,根据当前坐标位置绘制指定大小的单元格信息。绘制自定义表格需要更多的间与经历,可以完成许多复杂的表格信息。对于Visual Studio环境下的各种表格控件信息是为了加快应用程序的开发间与效率,对Visual Studio环境下各种表格控件信息进行快速的打印预览,主要支持Visual Studio环境下的C/S结构应用程序表格控件DataGridView控件、DataGrid控件、支持B/S结构应用程序表格控件有GridView控件、DataGrid控件。在各种动态网页开发语言下使用VBScript、JavaScript脚本语言进行各种信息的打印预览工作,可以直接打印HtmlTable网页元素中的文字信息。 在控件演示实例中有本控件的详细说明文件,本控件现在是打印预览控件的测试版本,测试版本与正式版的区别在于测试版只可打印一页并且具有水印。但制作效果和预览效果和正式版一样。想有意购买者请与我联系。 现在本控件分两个版本,分别是C# webprintpreview 1.0与2.0两种,1.0版本是只能在C/S体系架构应用程序使用,不支持Web形式下的B/S体系架构应用程序。单价格是200元人民币整。2.0支持C/S 、B/S体系架构应用程序,完全支持Web形式下的开发环境。价格400元人民币整。想有意购买者请与我们联系。 联系人:孙雷 毛同洪 联系电话:27838862 13682153445 联系地址:天津市和平区鞍山道众诚小区3-1-205 企业qq: 1090495821 e-mail:sunlei638@sohu.com 1090495821@qq.com 购买者请先与我们联系,通过银行汇款后通过QQ、 MSN 或电子邮件发送正式版控件。 本控件1.0版本价格是人民币:贰佰圆整 即¥200元整 本控件2.0版本价格是人民币:肆佰圆整 即¥400元整

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧