[原创]Flex中DataGrid分页(客户端、服务端)
这两天做了一个Flex的DataGrid分页(paging)控件,支持客户端、服务端两种分页形式;这里着重分享一下思路,虽然是用flex做的,但只要掌握了思路,用别的编程语言也能达到同样的效果。
组件运行截图:
设计思路:
1,客户端、服务端
(1)客户端分页:将数据一次性取到客户端,客户要看哪一页的数据,显示哪一页的数据。
(2)服务端分页:客户要看哪一页的数据,向服务端请求哪一页的数据,客户端将请求到的数据显示给用户(可以在客户端、服务端分别做缓存,加快数据的读取),由于flex本身不具有数据库访问能力,可以考虑通过WebServices向服务器传递数据,数据的表示形式可以是XML、JSON(本文采用XML的形式)
2,分页表示层的设计
(1)页码条中4个按钮;这四个按钮分别为转到第一页,前一页,后一页,最后一页;当这四个按钮中的任意一点被点击时,页码要重绘,当前页码变化;且还要考虑当页码中有第一页时,前两个按钮要隐藏起来;当页码中有最后一页时,后两个按钮要隐藏起来。
(2)页码条中页码;当点击页码条中的页码时,DataGrid中更新显示数据即可,当前页码变化。
(3)显示总页数,总记录数;
(4)每页记录数,让用户通过下拉框选择;当用户选择新的每页显示记录数时,页码要重绘,总页数发生变化,当前页码变化。
(5)页码输入框,让用户输入任意页码(要检查输入数据是否合法),DataGrid显示页码中的数据,页码要重绘,总页数变化。
(6)查看所有;分页中的特殊情况,将每页记数置为记录总数即可达到要求!页码要重绘,总页数发生变化,当前页码变化
代码说明
(1)分页功能条,做一个自定义组件,布局如下:

2 < mx:Button id ="firstNavBtn" icon ="{firstIcon}" width ="10" height ="10" click ="navigateButtonClick('firstPage');" />
3 < mx:Button id ="preNavBtn" icon ="{preIcon}" width ="7" height ="10" click ="navigateButtonClick('prePage');" />
4 </ mx:HBox >
5 < mx:LinkBar id ="pageNav" itemClick ="navigatePage(event)" dataProvider ="{nav}" />
6 < mx:HBox paddingTop ="8" >
7 < mx:Button id ="nextNavBtn" icon ="{nextIcon}" width ="7" height ="10" click ="navigateButtonClick('nextPage');" />
8 < mx:Button id ="lastNavBtn" icon ="{lastIcon}" width ="10" height ="10" click ="navigateButtonClick('lastPage');" />
9 </ mx:HBox >
10 < mx:VRule height ="25" />
11 < mx:Label paddingTop ="3" id ="totalPagesLabel" text ="" />
12 < mx:Label paddingTop ="3" id ="totalRecordLabel" text ="" />
13 < mx:Label paddingTop ="3" text ="每页记录:" />
14 < mx:ComboBox id ="pageSizeComobox" cornerRadius ="0" paddingLeft ="0" fontWeight ="normal" width ="50" arrowButtonWidth ="10" change ="pageSizeSelectChange()" />
15 < mx:Label paddingTop ="3" text ="页码:" />
16 < mx:TextInput id ="pageNumber" width ="40" keyDown ="pageIndexInsertChange(event);" />
17 < mx:LinkButton id ="viewAllLinkBtn" label ="查看所有" click ="viewAll();" />
(2)页码条绘制方法,传参数为页码中的第一个页码

2 * 构建页码条
3 * pages:总页数
4 * pageIndex:当前页(注意,从0开始)
5 *
6 */
7 private function createNavBar(pageIndex:uint = 0 ): void {
8 nav.removeAll();
9 // 向前图标操作,first,Pre
10 if ( pageIndex > 1 ){
11 firstPage = 0 ;
12 firstNavBtn.visible = true ;
13 //
14 var intLFive: int = pageIndex - navSize; // calculate start of last 5;
15 //
16 prePage = intLFive;
17 preNavBtn.visible = true ;
18 }
19 else {
20 firstNavBtn.visible = false ;
21 preNavBtn.visible = false ;
22 }
23 // 页码条
24 for ( var x:uint = 0 ; x < navSize; x ++ ){
25 var pg:uint = x + pageIndex;
26 nav.addItem({label: pg + 1 ,data: pg});
27 //
28 var pgg:uint = pg + 1 ;
29 if (pgg >= totalPages){ // 搜索到最后一个页码,停止添加到navbar
30 x = navSize;
31 }
32 }
33 // 计算最后一组页码条中第一个页码的页码编号
34 var lastpage:Number = 0 ;
35 for ( var y:uint = navSize; y <= totalPages - 1 ;y = y + navSize ){ // lets calculate the lastpage button
36 if (y + 5 > navSize){
37 lastpage = y;
38 }
39 }
40 // 向后图标
41 if ( pg < totalPages - 1 ){
42 nextPage = pg + 1 ;
43 nextNavBtn.visible = true ;
44 lastPage = lastpage;
45 lastNavBtn.visible = true ;
46 }
47 else {
48 nextNavBtn.visible = false ;
49 lastNavBtn.visible = false ;
50 }
51 }
3分页触发的方法,组件中有一个属性为pagingFunction,为向服务端请求数据的函数;当该函数为空时,调用客户端分页;反之调用该方法进行服务端分页。

2 * 更新数据源,更新表格显示数据
3 */
4 private function refreshDataProvider(pageIndex:uint,isCreateNavBar:Boolean = true ,pageSize:uint = 0 ,resultReturn:Boolean = false ): void {
5 // 分页函数
6 if (dataGrid == null ) return ;
7 currentPageIndex = pageIndex;
8 if (pageSize == 0 ){
9 pageSize = this .pageSize;
10 } else {
11 this .pageSize = pageSize;
12 if ( ! resultReturn) totalPages = Math.ceil(orgData.length / pageSize);
13 }
14 if ( ! resultReturn){
15 if ( this .pagingFunction != null ){
16 pagingFunction(pageIndex,pageSize);
17 this .isCreateNavBar = isCreateNavBar;
18 }
19 else {
20 viewData = new ArrayCollection( orgData.source.slice((pageIndex * pageSize),(pageIndex * pageSize) + pageSize) );
21 dataGrid.dataProvider = viewData;
22 pageNumber.text = (pageIndex + 1 ).toString();
23
24 totalRecordLabel.text = ' 总记录数: ' + orgData.length.toString();
25 }
26 }
27 else {
28 dataGrid.dataProvider = orgData;
29 totalPages = Math.ceil(totalRecord / pageSize);
30 pageNumber.text = (pageIndex + 1 ).toString();
31 totalRecordLabel.text = ' 总记录数: ' + totalRecord.toString()
32 }
33 totalPagesLabel.text = ' 总页数: ' + totalPages;
34 if (isCreateNavBar) createNavBar(pageIndex);
35 }
代码下载