Ext表格分页

为Grid添加分页工具条

GridPanel配置中增加以下代码:

bbar:new Ext.PagingToolbar({

pageSize:10, // 每页显示10条记录

displayInfo:true,// 显示提示信息

displayMsg:"显示第{0}条到第{1},{2}条数据",

emptyMsg:"没有数据",

store:store

})

这个是在底部增加一个分页工具条,显示效果如图:

 

分页工具条的属性:

pageSize:每页显示多少条数据。

displayInfo:是否显示数据信息。

displayMsg:displayInfotrue时有效,用来显示有数据时的提示信息。{0},{1},{2}会自动被替换成相应的数据。

emptyMsg:没有数据时显示的信息。

 

注意:如果配置了分页工具条,则store.load()就应该在创建GridPanel之后执行,否则分页工具条将不起作用。

 

13.2后台获取分页数据

使用JSON传输数据,那么需要做下面更改:

1.Proxy使用HttpProxy,代码:

proxy:newExt.data.HttpProxy({url:'../../../ext_paging.jsp'}),

2.Reader使用Ext.data.JsonReader,代码:

reader:newExt.data.JsonReader({

totalProperty:"total",// 总共多少条记录

root:"root",// 数据数组

id:"id",// 标识每一条数据,可选

fields:["id","name","sex","birthday","description"]// 包含的数据fields

})

对应的JSON数据格式:

var json = {total:100,root:[

{id:0,name:'name0',sex:'man',description:'description0',birthday:'2000-10-20'},

{id:1,name:'name1',sex:'woman',description:'description1',birthday:'2000-10-20'},

{id:2,name:'name2',sex:'man',description:'description2',birthday:'2000-10-20'},

{id:3,name:'name3',sex:'woman',description:'description3',birthday:'2000-10-20'},

{id:4,name:'name4',sex:'man',description:'description4',birthday:'2000-10-20'},

{id:5,name:'name5',sex:'woman',description:'description5',birthday:'2000-10-20'},

{id:6,name:'name6',sex:'man',description:'description6',birthday:'2000-10-20'},

{id:7,name:'name7',sex:'woman',description:'description7',birthday:'2000-10-20'},

{id:8,name:'name8',sex:'man',description:'description8',birthday:'2000-10-20'},

{id:9,name:'name9',sex:'woman',description:'description9',birthday:'2000-10-20'}

]

};

Total:对应totalProperty,总共有多少条数据。

Root:对应root,就是返回的实际的数据。

 

3. 初始化时根据store.load()来获取希望的数据,代码:

store.load({

params:{

start:0,// 0开始

limit:10// 查询10条记录

}

});

后台代码:

Integer start =Integer.parseInt(request.getParameter("start"));

Integer pageSize =Integer.parseInt(request.getParameter("limit"));

 

String json ="{total:100,root:[";

 

for (inti=start;i<start+pageSize;i++) {

json += "{id:" + i +",name:'name" + i + "',sex:'" + (i %2 ==0?"man":"woman") + "'}";

if (i != start + pageSize -1) {

json += ",";

}

}

 

json +="]}";

 

response.getWriter().write(json);

 

 

 

13.3分页工具条显示在表格顶部

这个很简单,将bbar改成tbar就可以了。

var grid =newExt.grid.GridPanel({

el: 'content',

ds: ds,

cm:cm,

autoHeight:true,

width:700,

title: 'Jsp Json',

tbar: newExt.PagingToolbar({

pageSize: 10,

store: ds,

displayInfo: true,

displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2}',

emptyMsg: "没有记录"

})

});

效果:

 

同时在顶部和底部显示分页工具条,那就同时增加bbartbar就可以了。

 

 

 

13.4让Ext支持前台排序

前台排序是指一次性从后台把所有数据都读取到客户端,然后由客户端自动判断每次显示多少条数据。这样,分页时就补用再去后台读取数据了。这对于小数据量的分页是非常有利的。

 

虽然Ext并没有提供内存分页的功能,但是在Example/locale/目录中提供了一个PagingMemoryProxy扩展,它可以让我们从本地数组中读取数据,并进行分页。

 

1),引入PagingMemoryProxy.js

<script type="text/javascript"src="../locale/PagingMemoryProxy.js">

</script>

2),将MemoryProxy改为PagingMemoryProxy

3),用store.load({params:{start:0,limit:5}});加载前3条数据。

完整代码:

<linkrel="stylesheet"type="text/css"

href="../../resources/css/ext-all.css"/>

<scripttype="text/javascript"src="../../adapter/ext/ext-base.js"></script>

<scripttype="text/javascript"src="../../ext-all.js"></script>

<scripttype="text/javascript"src="../locale/PagingMemoryProxy.js"></script>

<scripttype="text/javascript">

Ext.onReady(function() {

var sm =newExt.grid.CheckboxSelectionModel();

var cm =newExt.grid.ColumnModel([

newExt.grid.RowNumberer(),

sm,

{

header : '编号',

dataIndex : 'id',

width : 50

},

{

header : '名称',

dataIndex : 'name',

width : 100,

sortable : true

},

{

header : '生日',

dataIndex : 'birthday',

width : 100,

sortable : true,

/* renderer:new Ext.util.Format.dateRenderer('y-m-d') */

renderer : function(value) {

if (valueinstanceof Date) {

returnnew Date(value).format('y-m-d');

}

return value;

}

},

{

header : '性别',

dataIndex : 'sex',

sortable : true,

renderer : function(value) {

if (value =='man') {

return'<spanstyle="color:red;font-weight:bold">'

+ value + '</span>';

}

return'<spanstyle="color:green;font-weight:bold">'

+ value +'</span>';

}

}, {

id : 'descn',

header : '描述',

dataIndex : 'description',

width : 200

} ]);

var data = [ ['1', '','desc1', '2000-01-15', 'man' ],

[ '2', '','desc2', '2010-01-15', 'woman' ],

[ '3', '','desc3', '2006-01-15', 'woman' ],

[ '4', '','desc4', '2009-01-15', 'man' ],

[ '5', '','desc5', '2002-01-15', 'woman' ],

[ '5', '','desc5', '2002-01-15', 'woman' ],

[ '5', '','desc5', '2002-01-15', 'woman' ],

[ '5', '','desc5', '2002-01-15', 'woman' ],

[ '5', '','desc5', '2002-01-15', 'woman' ],

[ '5', '','desc5', '2002-01-15', 'woman' ],

[ '5', '','desc5', '2002-01-15', 'woman' ]];

 

var store =newExt.data.Store({

proxy : newExt.data.PagingMemoryProxy(data),

reader : newExt.data.ArrayReader({}, [ {

name : 'id',

mapping : 0

}, {

name : 'name',

mapping : 1

}, {

name : 'sex',

mapping : 4

}, {

name : 'description',

mapping : 2

}, {

name : 'birthday',

mapping : 3

} ]),

sortInfo : {

field: 'name',

direction : 'ASC'

}

});

 

var grid1 =newExt.grid.GridPanel({

title : '员工信息',

renderTo : 'foregroundPagingGrid',

cm : cm,

store : store,

width : 700,

height : 120,

autoHeight : true,

enableColumnMove : false,

enableColumnResize : true,

loadMask : true,

viewConfig : {

forceFit : true,// 表格自动延伸每列的宽度,使之填满整个表格。

getRowClass : function(record, rowIndex, p, ds) {

if (rowIndex %2 == 0) {

return'oushu-row-color';

}

return'jishu-row-color';

},

columnsText : "显示的列",

scrollOffset : 30,//表格右侧为滚动条预留的宽度

sortAscText : "升序",

sortDescText : "降序"

},

autoExpandColumn : 'descn',

//sm:sm,

sm : newExt.grid.RowSelectionModel({

singleSelect : true

}),

bbar : newExt.PagingToolbar({

pageSize : 5, // 每页显示10条记录

displayInfo : true, // 显示提示信息

displayMsg : "显示第{0}条到第{1},{2}条数据",

emptyMsg : "没有数据",

store : store

})

});

store.load({params:{start:0,limit:5}});

});

</script>

 

效果:

 

13.5后台排序

默认情况下,Grid只能对当前页数据进行排序,如果要对所有数据进行排序,则需要将排序信息提交给后台,由后台组装SQL,并将排序后的数据返回页面。

 

服务器排序,需要将Ext.data.StoreremoteSort设置为true,这个属性是指是否能够进行远程排序,默认为false

var store =newExt.data.Store({

proxy:newExt.data.HttpProxy({

url:'../../../ext_paging.jsp'

}),

reader : newExt.data.JsonReader({

totalProperty:"total",

root:"root"

}, [ {

name : 'id',

mapping : 0

}, {

name : 'name',

mapping : 1

}, {

name : 'sex',

mapping : 4

}, {

name : 'description',

mapping : 2

}, {

name : 'birthday',

mapping : 3

} ]),

sortInfo : {

field : 'name',

direction : 'ASC'

},

remoteSort:true

});
remoteSort设置为true后,下次排序时会传递2个参数给后台,dirsort

Sort:要排序的字段。

Dir:升序还是降序(ASC/DESC)。

 

后台处理的代码:

Integer start =Integer.parseInt(request.getParameter("start"));

Integer pageSize =Integer.parseInt(request.getParameter("limit"));

// 要排序的字段

String sort = request.getParameter("sort");

// 升序还是降序(ASC/DESC)

String dir = request.getParameter("dir");

 

if (dir ==null ||"".equals(dir)) {

dir = "ASC";

}

 

String json="{total:100,root:[";

 

if (dir.equals("ASC")) {

for (inti=start;i<start+pageSize;i++) {

json += "{id:" + i + ",name:'name" + i +"',sex:'" + (i %2 == 0?"man":"woman") +"'}";

if (i != start+ pageSize -1) {

json += ",";

}

}

}

else {// 降序排

for (inti=start+pageSize;i>start;i--) {

json += "{id:" + i + ",name:'name" + i +"',sex:'" + (i %2 == 0?"man":"woman") +"'}";

if (i != start-1) {

json += ",";

}

}

}

 

json += "]}";

 

response.getWriter().write(json);

 

如果用SQL来实现就更简单了。

‘select * fromt_user_info order by ‘ + sort + ‘ ‘ + dir;

你可能感兴趣的:(ext)