`

ExtJS表格

    博客分类:
  • js
 
阅读更多

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'

         });
     });

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics