从事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

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

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

    1. 实现DevExpress GridControl 只有鼠标双击后才进行修改数据:修改GridView.OptionsBehavior.EditorShowMode属性为Click 2. 实现De ...

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

    如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...

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

    总结一下如何显示加载方式加载DLL, 首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图.(详细方法已经在前两篇文章中讲述,如有不懂,打开 ...

  4. CSS3学习总结——实现瀑布流布局与无限加载图片相册

    首先给大家看一下瀑布流布局与无限加载图片相册效果图: 一.pic1.html页面代码如下: <!DOCTYPE html> <html> <head> <me ...

  5. iOS 正确选择图片加载方式

    正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种: //方法1 UIImage *imag1 = [UIImage imageNamed:@"image.png ...

  6. jQuery瀑布流从不同方向加载3种效果演示

    很实用的一款插件jQuery瀑布流从不同方向加载3种效果演示在线预览 下载地址 实例代码 <section class="grid-wrap"> <ul clas ...

  7. ios 图片的两种加载方式

    控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...

  8. MVC Ajax Helper或jQuery异步方式加载部分视图

    Model: namespace MvcApplication1.Models { public class Team { public string Preletter { get; set; } ...

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

    1.确认数据库版本 2.数据准备 3.创建导入表及控制文件 4.直接加载方式演示 查看具体的日志: 5.传统加载方式演示 查看日志文件: 6.结论及两种方式的差异 经过比对direct比convent ...

随机推荐

  1. PHP检测日期格式

    <?php $date1 = '2019-01-01'; $date2 = '2019-01-01 23:59'; $date3 = '2019-01-01 23:59:59'; $date4 ...

  2. 《Mysql - 自增主键为何不是连续的?》

    一:自增主键是连续的么? - 自增主键不能保证连续递增. 二:自增值保存在哪里? - 当使用 show create table `table_name`:时,会看到 自增值,也就是 AUTO_INC ...

  3. Java对象深拷贝浅拷贝总结

    目录 深拷贝 1. 手动new 2. clone方法 3. java自带序列化 4. json序列化 性能测试 深拷贝总结 浅拷贝 1. spring BeanUtils(Apache BeanUti ...

  4. 作业调度框架Quartz.NET-现学现用-01-快速入门

    原文:作业调度框架Quartz.NET-现学现用-01-快速入门 前言 你需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行.一个自动执行而无须干预的任务在执 ...

  5. win10 idea启动Tomcat后控制台中文乱码

    idea 配置文件新增如下配置 -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8

  6. Throw 和Throws 的区别

    throw语句用在方法体内,表示抛出异常,由方法体内的语句处理.throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理. 和在service中处理异常的方式差不多,并没有什么特别新奇 ...

  7. flutter isolate demo

    main.dart import 'package:flutter/material.dart'; import 'package:flutter_isolate/flutter_isolate.da ...

  8. OC与swift相互调用

    一.OC调用swift文件 二.swift调用OC文件 三.注意和总结 添加: 四.自定义桥接文件 一.OC调用swift文件 在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一 ...

  9. 增强学习--TRPO算法

    理论部分参考 推导 数学上的分析 代码

  10. JavaScript函数参数传递

    Hello,今天和大家分享下JS中的一个基本概念:函数参数传递! 先来看看一个DEMO var str="hello world"; function func(s){ s=&qu ...