首页 > 代码库 > Ext表格控件一(更新10月11,选自《掏钱学习EXT》)

Ext表格控件一(更新10月11,选自《掏钱学习EXT》)

一.内容丰富,功能强大

Ext的功能十分强大,可以单选多选,高亮显示等等,还可以自动生成行号,支持checkbox全选,支持本地和远程的分页,渲染单元格。甚至可以在tree和grid之间进行拖拽等。

二.现在咱们就来设计一个grid吧

1.我们建立一个二维数组,为了设计一个表。

   在ext里面,这个列的定义叫做ColumnModel,简称的cm就是它了。这里我们建立一个三列的表格:

var cm = new Ext.grid.ColumnModel(    [           {header:"编号",dataIndex:"id"},           {header:"名称",dataIndex:"name"},           {header:"描述",dataIndex:"descn"}    ]);    

其中,header表示列的名称,dataIndex表示后面对应的东西。

 

2.这仅仅是个骨架,现在我们要往里面添加数据,当然数据也是二维的,我们在这里把数据直接写道js里面去。

var data =http://www.mamicode.com/ [      [‘1‘,‘name1‘,‘descn1‘],      [‘2‘,‘name2‘,‘descn2‘],      [‘3‘,‘name3‘,‘descn3‘],      [‘4‘,‘name4‘,‘descn4‘],      [‘5‘,‘name5‘,‘descn5‘]];

这个二维数组显示在grid里面应该是5行,每行三列,正好对应着id,name和descn,为了把想象变成现实,我们还需要对原始数据做一个转换。

3.How to 转换:我们需要一座桥梁。

我们希望grid不仅支持array,还可以支持json,xml,甚至支持咱们自己定义的数据格式。Ext为我们提供你一个桥梁,Ext.data.Store,通过它我们可以把任何格式的数据转换为grid可以使用的方式,这样不需要为每一种数据格式写一个grid你。我们看看Ext.data.store是如何转换array的。

var ds = new Ext.data.Store(      proxy:new Ext.data.MemoryProxy(data),      reader:new Ext.data.ArrayReader({},[              {name:‘id‘},              {name:‘name‘},              {name:‘descn‘}        ]             )    );ds.load();

ds要对应两个部分:proxy和reader。proxy告诉我们从哪里获取数据,reader告诉我们如歌解析这个数据。我们在这里用Ext.data.MemoryProxy来解析js变量的。我们直接把打他作为参数传递进去了。Ext.data.Arrayreader专门是用来解析数组,并且告诉我们塔会按照定义的规范进行解析,每行读取三个数据,第一个叫“id”等等,是不是很眼熟,他是对应cm定义的地方,与dataIndex是相对应的。这个cm就知道哪列应该显示哪条数据了。最后,还有执行一次load(),对数据进行初始化。

有人问到,要是第一列数据不是id而是name怎么办?可以使用mapping来解决

var ds = 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‘,mapping:3}        ]             )    );

如图所示,id和name两列的数据是翻转你,mapping的索引是从0开始的

4.我们需要装配。

var grid = new Ext.grid.Grid("grid",{      ds:ds,      cm:cm});
grid.render();

注意:上头是ext=1.x的写法,Ext.grid.Grid的第一个参数是渲染id的,对应在html里面有个<div id=‘grid‘></div>的东西,这样grid才知道把自己画在哪里。

创建完grid以后,还要用grid.render()方法,让grid开始渲染,这样才能显示出来。

把全部代码放在一块:

var cm = new Ext.grid.ColumnModel(    [           {header:"编号",dataIndex:"id"},           {header:"名称",dataIndex:"name"},           {header:"描述",dataIndex:"descn"}    ]);    

var data =http://www.mamicode.com/ [      [‘1‘,‘name1‘,‘descn1‘],      [‘2‘,‘name2‘,‘descn2‘],      [‘3‘,‘name3‘,‘descn3‘],      [‘4‘,‘name4‘,‘descn4‘],      [‘5‘,‘name5‘,‘descn5‘]];
var ds = 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‘,mapping:3}        ]             )    );
var grid = new Ext.grid.Grid("grid",{      ds:ds,      cm:cm});
grid.render();
 

出来的效果就是:

 

三.Ext2.0的差别

首先,Ext.grid.Grid不见你,咱们需要用Ext.grid.GridPanel,需要传递的参数也有区别。

var grid = new Ext.grid.GridPanel(  {      el:‘grid‘,      ds:ds,      cm:cm    }  );

负责渲染位置的id放到了{}里面,对应的名字是el。

其次,2.0少你“斑马线”,css有所不同吧。默认情况下,两个版本的grid都是可以拖拽列的,也可以改变宽度的。

四.常见功能

1.自主决定每一列的宽度

cm是支持每一列设置宽度的,如果你不设置的话,它才会取一个默认值,默认值是100

var cm = new Ext.grid.ColumnModel([          {header:"编号",dataIndex:"id",width:20}]);

关于自动填充,1.0版本为:

var grid = new Ext.grid.Grid(   "grid",   {ds:ds,     cm:cm,     autoSizeColumns:true  });

2.0版本中,则是用viewConfig中的foreFit。

var grid = new Ext.grid.GridPanel([           el:"grid",           ds:ds,           cm:cm,           viewConfig:{                      forceFit:true               } ]);

如果指定某列进行自动填充的话,在1.0版本里可以这样做:

在grid.Grid里加多一个参数:autoExpandColunm:"指定列的id"

2.让grid支持按列排序:在grid.ColumnModel需要按列排序的header处,后接:

sortable:true。

3.renderer渲染函数:实现某列字体颜色的不同。

var cm = new Ext.grid.ColumnModel([      {header:‘编号‘,dataIndex:"id"},      {header:"性别",dataIndex:"sex",renderer:function(value){         if(value=http://www.mamicode.com/=‘male‘){          return "<span style=‘color:red;font-weigh:bold;‘>红男</span><img src=http://www.mamicode.com/‘url‘>" }else{ 
return "<span style=‘color:green;font-weigh:bold;‘>绿女</span><img src=http://www.mamicode.com/‘url‘>" }
        }, ////省略部分代码  
} ]);

这里我们把男性颜色改为红色,女性改为红色,传递的参数value就是要改变颜色的文字。后面还接你一个图片链接,让表格内容更加鲜活。

这里,我们还要介绍一个render里面有多少参数:

value  是指当前单元格的值

cellmeta  保存的是cellId单元格id,应该是列号

record 是这行的所有数据,想要什么,直接用record.data[‘id‘]这样来获取

rowIndex  是行号,不是从头往下数的意思,是分页后的结果

columnIndex 列号

store  是你构造表格时候传递的ds,也就是说是表格里的所有数据,可以随便调用。

 

4.我们需要的是时间格式

当我们需要时间格式时,在数据源data.store()写下对应的type和dateFormat;

var ds = new Ext.data.Store( proxy:new Ext.data.MemoryProxy(data), reader:new Ext.data.ArrayReader(           {},          [            {name:‘id‘},            {name:‘name‘},            {name:‘descn‘},            {name:‘data‘,type:‘date‘,dataFormat:‘Y-m-dTH:i:s‘}                    ]           ) );

 

第二步,在cm里面我们可以这样写作:

{header:‘日期‘,dataIndex:"data",type:‘data‘,renderer:Ext.util.Format.dateRenderer(‘Y年m月d日‘)}

你看我们对应的值是Y年m月d日,对应着dateFormat的格式。

 

五.自动行号和多选checkbox

1.其实,多选checkbox和行号是renderer的延伸,两者经常一块使用。自动行号的语句是在cm里添加

new Ext.grid.RowNumerer(),

如何删除一行?在html里面写一个id为remove的button,在此举例删除第二行的消息。调用grid.view.refresh()可以刷新表单,从而使行号连续。

Ext.get(‘remove‘).on(     ‘click‘,     function(){         ds.remove(ds.getAt(1));
grid.view.refresh(); });

2.全选功能

先看表格

 具体多了什么?

var sm = new Ext.grid.CheckboxSelectionModel(handleMouseDown:Ext.emptyFn);

这一个全选的sm,身兼两职位,一是添加在cm里,二是添加在Ext.grid.GridPanel()里。(注:在此的Ext.emptyFn,是选中行时不选中checkbox,选中checkbox时不选中行)。

六.分页

分页是十分重要的一个功能,因为你处理的数据可能有上千条,并且他们不能统一出现在同一个页面里。

grid集成分页分两步。

1.弄出分页工具条

代码是这样的:

var gridFoot = grid.getView().getFooterPanel(true);var paging = new Ext.PagingToolbar(    gridFoot,ds,    {         pageSize:10,         displayInfo:true,         displayMsg:‘显示第{0}到{1}条记录,一共{2}条‘,         emptyMsg:‘没有记录‘     } );

首先使用的grid.getView().getFootPanel(true),得到grid最下面的那一条。

我们看看里边的参数:

pageSize  是每页显示几条数据

displayInfo 跟下面的配置有关,如果是false就不会显示提示信息

displayMsg 在displayInfo:true是有效,用来显示有数据时候的提示信息

emptyMsg 要是没有数据就显示这个。

在2.0版本中,就方便很多了。

直接在Ext.grid.GridPanel()里面增加:

bbar:new Ext.PagingToolbar(........)

如果在顶部的话

tbar:new Ext.PagingToolbar()

 

七.EditorGrid

1.让单元作可编辑的文本,只要在cm的header后加上:

editor:new Ext.grid.GridEditor(           new Ext.form.TextField({                allowBlank:false                }))

编辑文本为TextField,不可以为空。默认双击时激活这个编辑器,也可以在grid.EditorGrid里写下clicksToEdit:1,修改成单击事件。

2.添加一行,删除一行。

首先,我们做一个record

var Record = Ext.data.Record.create([ {name:‘id‘,type:‘string‘}, {name:‘name‘,type:‘string‘}, {name:‘descn‘,type:‘string‘}]);

现在我们加两个按钮,一个添加行,一个是删除行,暂时把他们放在grid头部

var gridHead = grid.getView().getHeaderPanel(true);var tb = new Ext.Toolbar(      gridHead,[‘-‘,{       text:‘添加一行‘,       handler:function(){                   var initValue =http://www.mamicode.com/{id:‘‘,name:‘‘,descn:‘‘};                   var p =new Record(initValue);                   grid.stopEditing();                   ds.insert(0,p);                   grid.startEditing(0,0);                   p.dirty = true;                   p.modifued = initValue;                   if(ds.modified.indexOf(p) == -1) {                       ds.modified.push(p);                              }                  },              ‘-‘     {      text:‘删除一行‘,      handler:function(){               Ext.Msg.confirm(                      ‘信息‘,‘确定要删除?‘,                       function(btn){                       if(btn == ‘yes‘){                               var sm = grid.getSelectionModel();                               var cell = sm.getSelectedCell();                               var record = ds.getAt(cell[0]);                               ds.remove(record);                                   }                               }                         );                    }               }          },‘-‘]);

 我们定义了一个record,给它赋值后关闭表格的编辑状态(grid.stopEditing()),然后插入ds的第一行。startingEditing()激活第一行第一列的编辑状态,提示你最好开始写入数据。dirty和modifed的操作是为了好看,grid会给予张数据部分特殊显示。

删除一行按钮是通过行号找到ds这一行对应的record,然后删除它。

 

Ext表格控件一(更新10月11,选自《掏钱学习EXT》)