这几天在工作过程遇到了WPF分页的情况,以前在Asp.net中分页做过,而且asp.net中自带了分页控件(自己觉得是一个伪分页),而WPF没有自带分页控件,在网上找了一下关于WinForm相关分页资料,并学习了。这几天脑袋一直在想一些问题,下面把一些想法记录下来。这些想法只是自己的一些想法,仅供参考。
一、为什么要分页,分页的好处
个人觉得真正的分页实际上蕴含了两层意思。(1)数据的分屏显示(2)数据的分批获取。
既然分页实际包含了分屏和分批获取数据,那我们先说说分屏的好处,分屏的好处不言而喻,每页显示适量的数据,让客户只关注当前屏的数据,不让客户有眼花缭乱的感觉。
再说说数据的分批获取。这个可以说是提高用户体验的最本质的东西,每次服务器端获取适量的数据,而不是所有的数据。这样单次获取的数据会很快,立即呈现一批数据给用户,这样可以避免因为一次性获取大量的数据画大量的时间,而界面一直都是空的,让用户感觉一直没有获取到数据的感觉,以为操作失败的假象。
从分屏显示和分批加载数据两个方面说了下分页为什么要分页,分页的好处也就很明显了。
二、怎样分页
我们知道了分页有两层意思,那么怎样分页就很好弄了。
(一)分批获取数据
存储过程:
方法一:用于B/S,或C/S以“首页”,“上一页”,“下一页”,“尾页”,“共多少页”...的方式分屏加载显示数据。
传入参数:当前页,当前显示的条数(一般出入是固定的值),排序类型(升序还是降序),排序字段。
输出参数:总的记录条数
方法二: 更多用于C/S分批获取数据加载到界面,并以呈现滚动条的方式分页显示数据。这个存储过程实际上对方法一的一种衍生。
传入参数:起始记录位置,当前页显示条数(一般是固定值),排序类型(升序还是降序了),排序
字段
输出参数:bool类型,是否还有数据。
这些存储过程网上有,后续将在实战经验里写上这些存储过程运用。
(二)分屏显示
这个很简单,这里不说了
三、为什么C/S模式下微软不自带分页控件
想想做asp.net的时候,asp.net中就自带了分页控件,我觉得叫分屏控件比较恰当,实际上把所有数据取到绑定到分页控件上,每页显示一个固定的页数,如果数据量大点还是会有窗口冻结假死的情况,所以说这是伪分页。虽然WinForm和WPF没有带分页控件,我们可以自己写的,几个按钮(首页,上一页,下一页,尾页等),几个Lable(共多少页,当前是第几页等),但是如果我们还是一回把数据取过来,加载到界面上,在绑定到分页控件上,也会出现界面冻结的情况。
其实我们分页的目的是分屏(让页面固定显示适量的数据条数),而其实WinForm和WPF有滚动条,他实际上是分屏的另一种形式(每次显示的数据条数实际上是DataGrid等数据控件的可视区域),所以C/S程序不需要像Asp.net弄一个上一页,下一页等,我想这正是在C/S程序中没有用到分页控件的原因吧,当然你也可以有上一页,下一页,那么你的滚动条就没有多大作用。
而分页真正的目的不是分屏,而是分批获取数据,不管是b/s还是c/s程序,我点击那个页或拖动滚动条就只取一个固定适量记录条数(这个数据比获取所有满足的条件的记录条数速度肯定是快些的),然后马上加载到界面,这样马上可以呈现到界面上,给用户良好的体验。
四、c/s程序数据加载的实现
(一)分屏分批加载
这种做法就是让当前界面中总是显示固定适量数据,自己添加分页按钮(上一页,下一页),滚动滑轮(滚动一次)分批取数据,分批加载到界面上。
这个种做法每次操作都要和服务器交互。对于高频变化的数据服务数据这种方法比较适合,这个可以用上面怎样分页中的存储过程方法一实现
(二)不分屏分批加载
这里的”不分屏分屏加载“,实际上是分屏了的,而是以滚动条的形式分屏的。只是以固定这种做法将数据以新线程或异步的方式分批加载完成后,也是每加载一批数据立即显示到界面上,给用户的感觉数据不断的加载(从一开始就有数据,界面不会空白等待等),将所有的数据取到,缓存到本地的集合中,对缓存本地集合进行排序,过滤等操作。这个可以用上面怎样分页中的存储过程方法二实现
五、实战经验
将使用,二中怎样分页的存储过程实现分页。这里使用WPF作为作为案例讲解。
(一)分屏分批加载
(二)不分屏分批加载
六、相关资源
http://www.cnblogs.com/wuhuacong/archive/2009/07/07/1518730.html
http://xuzhihong1987.blog.163.com/blog/static/267315872011315114240140/
http://wenku.baidu.com/view/99b824116c175f0e7cd13730.html