zoukankan      html  css  js  c++  java
  • DevExpress GridControl 使用瀑布加载方式加载数据

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

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

    传统的分页


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

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

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

    瀑布流的分页


    image

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

    如何实现


    熟悉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

  • 相关阅读:
    King's Quest
    JavaScript“并非”一切皆对象
    javascript中的style只能取到在HTML中定义的css属性
    jquery中的$(this)和this
    WEB安全字体(Web Safe Fonts)-网页设计用什么字体兼容性好?
    css各种水平垂直居中
    css绘制各种形状
    css3椭圆运动
    通过时间戳控制类
    js中的面向对象程序设计
  • 原文地址:https://www.cnblogs.com/zhaoxixi/p/4436025.html
Copyright © 2011-2022 走看看