DevExpress GridControl 使用瀑布加载方式加载数据

从事winform开发已经快三年了,这三年中两年使用DevExpress控件进行winform系统开发,对Dev控件有自己的一些思考,下面就常用的表格控件GridControl的分页进行一些讨论。

在平时的系统开发中,对不对C/S系统中的列表进行分页,我和同事也有不一样的见解。同事认为C/S中Grid不必分页,因为分页会对数据的查看带来不便,但是又会遇到数据量较大,传输的压力,他倾向于使用查询条件来约束查询返回的数据量。我们的系统一开始也的确是这么实现的。不进行任何分页处理,一次查询出所有满足条件的记录。但是项目后期发现,我们的想法在一般的界面不会出现任何问题。但是极个别窗体会出现明显的卡顿,数据量太大,简直不忍直视,这使得我必须去找到一种合理的解决方式来改善这个问题。

传统的分页



我引用 我学习Dev控件时看的一篇帖子的一张图,这张图来自博客园中 伍华聪大哥 的 博客(多有冒犯,如对伍华聪大哥带来不方便的地方,我立刻删除。)

如何Windows分页控件中增加统计功能

这种分页方式是我们最最常见的一种方式,可以自由选择查看的页数和上一页,下一页,通用性较好且比较直观,大方。

瀑布流的分页



这种分页方式有些借鉴网页瀑布流,采用下拉滚动条或者使用鼠标滚轮来实现延时加载的方式,这种方式给用户带来的体验会比传统的方式好一些,如果控制每次加载的记录条数合理,用户完全感受不到数据时延迟加载的。

如何实现



熟悉Dev控件的朋友估计看出来了,这是一个默认设置的GridControl+GridView控件,要实现这个效果,首先我考虑的是如何检测滚轮事件。通过谷歌找到Dev官方的问答找到了这么一个事件TopRowChanged,这个事件会在GridView中可见的首行记录发生变化时触发。没错,就是这个事件的贡献帮助我们完成这种分页模式。

下面就是方法的实现

int currentIndex = 1;

        int currentCount = -1;

        int totalCount = -1;

        VirtualData data = null;

        List<Student> StudentList = null;

        private void btnQuery_Click(object sender, EventArgs e)
        {
            data = new VirtualData();
            gridView1.TopRowChanged += gridView1_TopRowChanged;
            currentIndex = 1;
            var dataSource = data.Query(currentIndex, out totalCount);
            StudentList = dataSource.ToList();
            gridControl1.DataSource = StudentList;
            currentCount = StudentList.Count;

            this.labelControl1.Text = "记录总数: " + totalCount.ToString();
        }

        private void gridView1_TopRowChanged(object sender, EventArgs e)
        {
            if (gridView1.IsRowVisible(currentCount - 10) == DevExpress.XtraGrid.Views.Grid.RowVisibleState.Visible)
            {
                gridView1.TopRowChanged -= gridView1_TopRowChanged;
                var dataSource = data.Query(++currentIndex, out totalCount);
                StudentList.AddRange(dataSource);
                gridControl1.RefreshDataSource();
                currentCount = StudentList.Count;
                if (dataSource.Count == 100)
                {
                    gridView1.TopRowChanged += gridView1_TopRowChanged;
                }
            }
        }

  总结:这两种方式都有自己的优点,已经在上面进行了分析,当然,只有适合自己项目的方式才是好的方式。

  我会在后面将上面的代码进行封装,够成新的PageGridControl,方便调用。

  最后,这是本人第一次发帖子,很多地方不懂,需要向各位博客园的朋友进行学习,所以你对这篇文章有什么意见和建议,欢迎留言,我会及时进行回复,但请喷子绕道。

最后发布Demo文件的链接: GridControlFlowDataDemo.rar

时间: 2024-12-17 01:08:54

DevExpress GridControl 使用瀑布加载方式加载数据的相关文章

实现DevExpress GridControl 只有鼠标双击后才进行修改数据

1. 实现DevExpress GridControl 只有鼠标双击后才进行修改数据:修改GridView.OptionsBehavior.EditorShowMode属性为Click 2. 实现DevExpress GridControl 只有鼠标双击后才进行修改数据:修改GridView.OptionsBehavior.EditorShowMode属性为MouseDownFocused 然后实现下面代码: private void gridView1_MouseDown(object sen

浅谈Entity Framework中的数据加载方式

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx,其中的一系列文

动态链接库知识点总结之三(如何以显示的方式加载DLL)

总结一下如何显示加载方式加载DLL, 首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图.(详细方法已经在前两篇文章中讲述,如有不懂,打开链接查看) (1)    新建项目,名称为:dll,添加一个源文件(.cpp),编代码,编译文件 . (2)    为项目添加一个模块定义文件(上一篇文章中详细介绍)(先新建一个文本,再改属性名),编辑代码,如下图 (3)    新建一个DLL测试应用程序(基于对话框的),项目名字:TestDLL,

三种加载方式

重点总结:    即:三种加载方式    1>传统加载方式------默认路径:tomcat/bin/目录    2>使用ServletContext对象-----默认路径:web应用(工程)目录    3>使用类加载器------默认路径:WEB-INF/classes/目录 一.利用ServletContext对象读取资源文件--默认目录为:工程(应用)路径                重点方法:                        InputStream getReso

iOS 正确选择图片加载方式

正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种: //方法1 UIImage *imag1 = [UIImage imageNamed:@"image.png"]; //方法2 UIImage *image2 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image.png" ofType:nil]]; //方法3 NSData

post方式加载iframe

最近开发遇到一个问题,数据库某个字段里面存着整个html代码.需求是预览的时候需要可视化,将html直接展示到页面. 那么问题来了: 1.需要展示的html中的样式会与外面的页面冲突. 2.直接加载数据中的html,可能存着一些脚本错误. 首先想到的解决办法是用iframe,但是iframe是直接加载某个页面. 想到的方法是: iframe加载一个空页面,将HTML代码直接填充到空页面,然后显示. 这种方式可以成功.然而因为某些原因html代码不能再次从数据库读取,html代码参数需要传递,然而

ios 图片的两种加载方式

控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) [objc] view plaincopy + (UIImage *)imageNamed:(NSString *)name; 注:必须是png文件.需要把图片添加到 images.xcassets中 例如: [objc] view plaincopy @property (weak, nonatomic) IBOutlet UIImageView 

sql*loader的直接加载方式和传统加载方式的性能差异

1.确认数据库版本 2.数据准备 3.创建导入表及控制文件 4.直接加载方式演示 查看具体的日志: 5.传统加载方式演示 查看日志文件: 6.结论及两种方式的差异 经过比对direct比conventional要提高了10倍效率. 对比这两种加载方式的区别: Direct 特点 ü  数据绕过SGA直接写入磁盘的数据文件. ü  数据直接写入高水位线HWM之后的新块,不会扫描HWM之前的空闲块. ü  commit之后移动HWM他人才能看到. ü  不对已用空间进行扫描. ü  使用direct

10几款网站瀑布流布局图片无限加载动效

jQuery选项卡形式图片瀑布流布局选项卡切换效果代码 jquery masonry瀑布流插件制作图片瀑布流布局代码 原生js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果 jquery masonry瀑布流插件制作图片瀑布流布局代码 jquery柔韧性的图片滑动瀑布流布局 jquery时间轴插件文字图片瀑布流布局时间轴特效(不兼容IE678) modernizr html5图片预加载瀑布流布局鼠标悬停动画效果代码 jquery.waterfall.js自动底部填充对齐的瀑布流布局代码 jquer