当前位置: 代码迷 >> JavaScript >> ExtJS报表
  详细解决方案

ExtJS报表

热度:111   发布时间:2012-08-25 10:06:20.0
ExtJS表格

1.?简单表格控件??(由类Ext.grid.GridPanel来定义)
2.?可编辑表格控件(由类Ext.grid.EditorGridPanel定义)
3.?属性表格控件???(由类Ext.grid.PropertyGrid定义)
4.?分组表格控件???(由类Ext.grid.Group定义)
基本介绍
???表格由类Ext.grid.GridPanel定义,继承于Ext.Panel,其xtype为grid,在Ext中?表格控件必须包含列定义信息,并指定表格的数据存取器。表格的
列由Ext.grid.ColumnModel定义,数据存取器由Ext.data.Store定义。根据解析数据的不同,数据存取器可分为JsonStore、SimpleStore、GroupingStore等。


Ext表格包含的功能
1.?选择一条记录、选择多条记录、突出显示选中行
2.?调整列宽、列排序、显示行号、支持复选框、设置查看某些列
3.?支持本地分页和远程分页
4.?可编辑表格、添加新行、删除一行或多行。
5.?数据校验
6.?拖放改变表格大小、拖放一行或多行、树形和表格之间进行数据拖放。


定义列信息
???表格是二维的,列由Ext.grid.ColumnModel类定义,?简称cm,它是整个表格的列模型,其由columns配置属性来描述,columns是一个数组,每一行数据
元素描述表格的一列信息,包含的信息如下:
header:?列标题
dataIndex:?列对应的记录集字段
sortable:?列是否可排序
renderer:?列的渲染函数
width:????列宽度
format:???格式化信息
如:
??var?cm?=?new?Ext.grid.ColumnModel([
????????{?header:?'编号',?dataIndex:?'id'?},
????????{?header:?'名称',?dataIndex:?'name'?},
????????{?header:?'描述',?dataIndex:?'descn'?},
????]);

定义数据
表结构确定后,就可以定义数据,如下:?
var?data?=[[1,2,3],[4,5,6],[7,8,9]]??--使用二维数组定义数据

定义数据存储对象
??数据存储对象由Ext.data.Store类来定义,数据存储对象负责把各种各样的原始数据(如二维数组、JSON对象数组、XML文本等)等转换成表格可以识别的
Ext.data.Record类型的对象,这样就可以把任何格式的数据转换成表格可以使用的形式。
Store对应二个部分:?proxy和reader。
proxy:?获取数据的方式,?Ext.data.MemoryProxy,它是专门用来解析JavaScript变量的。在定义时只需要把data作为参数传递进去即可。
reader:?如何解析数据,Ext.data.ArrayReader专门用来解析数组,主要是设置如何使数据和列对应。主要由name和mapping指定,name对应列的dataIndex。
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????mapping对应列的索引
最后需要执行store.load()?来初始化数组。

下面是一个完整的示例:
?Ext.onReady(function()?{
????????--定义列信息
????????var?cm?=?new?Ext.grid.ColumnModel([
????????????{?header:?'编号',?dataIndex:?'id'?},
????????????{?header:?'名称',?dataIndex:?'name'?},
????????????{?header:?'描述',?dataIndex:?'descn'?}
????????]);

???????--定义二维数组数据
????????var?data?=?[
????????????['1',?'name1',?'descn1'],
????????????['2',?'name2',?'descn2'],
????????????['3',?'name3',?'descn3'],
????????????['4',?'name4',?'descn4'],
????????????['5',?'name5',?'descn5']
????????];
????????--定义数据存储对象
????????var?store?=?new?Ext.data.Store({
????????????proxy:?new?Ext.data.MemoryProxy(data),??--从内存获取数据
????????????reader:?new?Ext.data.ArrayReader({},?[??--使用数组解析器解析数组
????????????????{?name:?'id',mapping:1?},
????????????????{?name:?'name',mapping:0?},
????????????????{?name:?'descn'?}
????????????])
????????});
????????--初始化数据
????????store.load();??

????????--装配数据
????????var?grid?=?new?Ext.grid.GridPanel({
??????????????autoHeight:?true,
??????????????renderTo:?'grid',
??????????????store:?store,
??????????????cm:?cm
????????????});

????});

?

?

一、?取消列拖动,取消列调整大小,行的斑马线效果
????默认的表格展现在我们面前的时候,列的顺序可以随意移动,也可以随意调整列宽,如何禁用了?
????enableColumnMove:??false
????enableColumnResize:?false
????stripeRows:true
例如:
????var?grid?=?new?Ext.grid.GridPanel({
?????????????cm:?cm,????????????--设置列定义
?????????????store:?store,??????--设置数据存取对象
?????????????autoHeight:?true,??--自动适应行高
?????????????stripeRows:true,???--显示斑马线效果
?????????????renderTo:?'grid'???--渲染表格到div等于grid的容器中

????});
?
二、设置表格读取数据时的遮罩效果
????loadMask:true???--这样表格在store.load()完成之前一直显示?"loading..."?本地数据由于过快?可能看不到这一效果。

三、?自主决定每列的列宽,列标题的对齐方式
???默认情况下,Ext的表格宽度为100px,可以通过列定义时修改这一值。
????var?cm?=?new?Ext.grid.ColumnModel([
?????????{?header:?'编号',?dataIndex:?'id'????,width:200,align:'center'?},??--注意像素不加px
?????????{?header:?'姓名',?dataIndex:?'name'??,widht:300,?align:'right'},
?????????{?header:?'描述',?dataIndex:?'descn'?,widht:150,?align:'left'?}
????]);
???上面的示例还是需要我们自己计算列的宽度,Ext提供了另外一个表格属性来实现列自动填满表格的设置,相当于WinForm中的Fill属性。
????var?grid?=?new?Ext.grid.GridPanel({
?????????????cm:?cm,
?????????????store:?store,
?????????????viewConfig:{?forceFit:true},???--视图层重新计算所有列宽后填充表格。
?????????????renderTo:?'grid'

??????});
???还可以指定某列宽度自动延伸,这个时候需要给列设置一个id
如:var?cm?=?new?Ext.grid.ColumnModel([{id:'descn',header:'描述',dataIndex:'descn'}]);
????var?grid?=?new?Ext.grid.GridPanel({
??????autoExpandColumn:'descn',
??????cm:cm,
??????store:store,
??????renderTo:'grid'
????})

四、?列排序
???Ext的列默认是不排序的。?如果需要添加列排序功能,需要在定义列模型时增加sortable属性。如:
???var?cm?=?new?Ext.grid.ColumnModel([
??????{?header:'编号',dataIndex:'id',sortable:true?}
???]);
???在显示时强制按某列排序,需要通过sortInfo属性来为Ext.data.Store设置一个默认的排序方式。如:
???var?store?=?new?Ext.data.Store({
??????proxy:new?Ext.data.MemoryProxy(data);
??????reader:new?Ext.data.ArrayReader({},[
????????{?name:'id'??,mapping:0},
????????{?name:'name',mapping:1},
????????{?name:'desc',mapping:2}
??????]),
?????sortInfo:{field:'name',direction:'ASC'}??--field:表示排序的列名,?direction:代表排序的方式,ASC升序?DESC降序。
???});

???对中文列排序的支持,?Ext默认使用的ASCII码进行排序的,而我们却按拼音顺序排序,所以对中文的排序效果存在问题,所以需要重写
Ext的applySort函数,如:
Ext.data.Store.prototype.applySort?=?funciont(){
???if(this.sortInfo?&&?this.remoteSort){
??????var?s?=?this.sortInfo;??????????????????--获取排序列JSON对象
??????var?f?=?s.field;????????????????????????--获取排序列的字段
??????var?st?=?this.fields.get(f).sortType;???--获取排序字段的排序函数
??????var?fn?=?function(r1,r2){
??????????var?v1?=st(r1.data[f]);
??????????var?v2?=st(r2.data[f]);
??????????if(typeof(v1)?=='string'){
????????????return?v1.localCompare(v1);
?????????}
????????return?v1?>?v1???1:?(v1?<?v2???-1:?0);
??????};
??????this.data.sort(s.direction,fn);
??????if(this.snapshot?&&?this.snapshot?!=?this.data){
?????????this.snapshot.sort(s.direction,fn);
??????}
???}
};
把上面的函数放到Ext文件的最底端就可以很好的解决Ext中文排序不支持拼音排序的问题。

五、显示日期类型的数据
???JSON返回的数据只能是数字和字符串,如何把某一个字符串解析成日期格式了,看下面的例子。
????var?cm?=?new?Ext.grid.ColumnModel([
?????????{?header:?'编号',?dataIndex:?'id'},
?????????{?header:?'姓名',?dataIndex:?'name'},
?????????{?header:?'描述',?dataIndex:?'descn'?},
?????????{?header:?'日期',?dataIndex:'date',type:'date',renderer:Ext.util.Format.dateRenderer('Y年m月d日')}??--?日期列现实的格式:Y-m-d?2010-10-08
????]);
???--?renderer:?用于格式化日期格式的数据
??????var?data?=?[
???????[1,?'小宝',?'descn1',?'2010-08-01?18:23:54'],
???????[2,?'小马',?'descn2',?'2010-08-01?18:21:54'],
???????[3,?'小强',?'descn3',?'2010-08-01?18:22:54'],
???????[4,?'小李',?'descn4',?'2010-08-01?18:20:54'],
???????[5,?'小张',?'descn5',?'2010-08-01?18:24:54']
?????];

?????var?store?=?new?Ext.data.Store({
?????????proxy:?new?Ext.data.MemoryProxy(data),
?????????reader:?new?Ext.data.ArrayReader({},?[
??????????????????{?name:?'id'?},
??????????????????{?name:?'name'?},
??????????????????{?name:?'descn'?},
??????????????????{?name:?'date',?type:?'date',?dateFormat:?'Y-m-d?h:i:s'?}?--?与data的日期格式对应
???????????????])
?????});
????--?type:属性会告诉render在解析的原始数据的时候把对应的列作为日期类型处理。
????--?dateFormat:属性把得到的字符串转换成相应的日期格式。
?????store.load();

?????Ext.onReady(function()?{
?????????var?grid?=?new?Ext.grid.GridPanel({
?????????????cm:?cm,
?????????????store:?store,
?????????????stripeRows:?true,
?????????????height:?300,
?????????????renderTo:?'grid'

?????????});
?????});

  相关解决方案