表格

 表格

A、普通表格

ExtJS 中的表格功能非常强大,包括了排序、缓存、拖动、隐藏某一列、自动显示行号、列汇总、单元格编辑等实用功能。

表格由类Ext.grid.GridPanel 定义,继承自Panel,其xtype 为grid。ExtJS 中,表格Grid必须包含列定义信息,并指定表格的数据存储器Store 。表格的列信息由类Ext.grid.ColumnModel 定义、而表格的数据存储器由Ext.data.Store 定义,数据存储器根据解析的数据不同分为JsonStore、SimpleStore、GroupingStore 等。

首先来看最简单的使用表格的代码:

Ext.onReady(function(){

var data=[ [1, 'EasyJWeb', 'EasyJF','www.easyjf.com'],

[2, 'jfox', 'huihoo','www.huihoo.org'],

[3, 'jdon', 'jdon','www.jdon.com'],

[4, 'springside', 'springside','www.springside.org.cn'] ];

var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});

var grid = new Ext.grid.GridPanel({

renderTo:"hello",

title:"中国Java开源产品及团队",

height:150,

width:600,

columns:[{header:"项目名称",dataIndex:"name"},

{header:"开发团队",dataIndex:"organization"},

{header:"网址",dataIndex:"homepage"}],

store:store,

autoExpandColumn:2

});

});

上面的代码中,第一行”var data=…”用来定义表格中要显示的数据,这是一个[][]二维数组;第二行”var store=…”用来创建一个数据存储,这是GridPanel 需要使用配置属性,数据存储器Store 负责把各种各样的数据(如二维数组、JSon 对象数组、xml 文本)等转换成ExtJS的数据记录集Record,关于数据存储器Store 我们将在下一章中作专门介绍。第三行”var grid= new Ext.grid.GridPanel(…)”负责创建一个表格,表格包含的列由columns 配置属性来描述,columns 是一数组,每一行数据元素描述表格的一列信息,表格的列信息包含列头显示文本(header)、列对应的记录集字段(dataIndex)、列是否可排序(sorable)、列的渲染函数(renderer)、宽度(width)、格式化信息(format)等,在上面的列子中只用到了header 及dataIndex。下面我们看简单看看表格的排序及隐藏列特性,简单修改一下上面的代码,内容如下:

Ext.onReady(function(){

var data=[ [1, 'EasyJWeb', 'EasyJF','www.easyjf.com'],

[2, 'jfox', 'huihoo','www.huihoo.org'],

[3, 'jdon', 'jdon','www.jdon.com'],

[4, 'springside', 'springside','www.springside.org.cn'] ];

var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});

var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},

{header:"开发团队",dataIndex:"organization",sortable:true},

{header:"网址",dataIndex:"homepage"}]);

var grid = new Ext.grid.GridPanel({

renderTo:"hello",

title:"中国Java开源产品及团队",

height:200,

width:600,

cm:colM,

store:store,

autoExpandColumn:2

});

});

直接使用new Ext.grid.ColumnModel 来创建表格的列信定义信息,在”项目名称”及”开发团队”列中我们添加了sortable 为true 的属性,表示该列可以排序,执行上面的代码,我们可以得到一个支持按”项目名称”或”开发团队”的表格

另外,每一列的数据渲染方式还可以自己定义,比如上面的表格中,我们希望用户在表

格中点击网址则直接打开这些开源团队的网站,也就是需要给网址这一列添加上超级连接。

下面的代码实现这个功能:

function showUrl(value)

{

return ""+value+"";

}

Ext.onReady(function(){

var data=[ [1, 'EasyJWeb', 'EasyJF','www.easyjf.com'],

[2, 'jfox', 'huihoo','www.huihoo.org'],

[3, 'jdon', 'jdon','www.jdon.com'],

[4, 'springside', 'springside','www.springside.org.cn'] ];

var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});

var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},

{header:"开发团队",dataIndex:"organization",sortable:true},

{header:"网址",dataIndex:"homepage",renderer:showUrl}]);

var grid = new Ext.grid.GridPanel({

renderTo:"hello",

title:"中国Java开源产品及团队",

height:200,

width:600,

cm:colM,

store:store,

autoExpandColumn:2

});

});

上面的代码跟前面的示例差别不大,只是在定义”网址”列的时候多了一个renderer 属性,即{header:"网址",dataIndex:"homepage",renderer:showUrl}。showUrl 是一个自定义的函数,内容就是根据传入的value 参数返回一个包含<a>标签的html 片段。

自定义的列渲染函数可以实现在单元格中显示自己所需要的各种信息,只是的浏览器能处理的html 都可以。

除了二级数组以外,表格还能显示其它格式的数据吗?答案是肯定的,下面假如我们的表格数据data 定义成了下面的形式:

var data=[{id:1,

name:'EasyJWeb',

organization:'EasyJF',

homepage:'www.easyjf.com'},

{id:2,

name:'jfox',

organization:'huihoo',

homepage:'www.huihoo.org'},

{id:3,

name:'jdon',

organization:'jdon',

homepage:'www.jdon.com'},

{id:4,

name:'springside',

organization: 'springside',

homepage:'www.springside.org.cn'}

];

也就是说数据变成了一维数组,数组中的每一个元素是一个对象,这些对象包含name、organization、homepage、id 等属性。要让表格显示上面的数据,其实非常简单,只需要把store 改成用Ext.data.JsonStore 即可,代码如下:

var store=new Ext.data.JsonStore({data:data,fields:["id","name","organization","homepage"]});

var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},

{header:"开发团队",dataIndex:"organization",sortable:true},

{header:"网址",dataIndex:"homepage",renderer:showUrl}]);

var grid = new Ext.grid.GridPanel({

renderTo:"hello",

title:"中国Java开源产品及团队",

height:200,

width:600,

cm:colM,

store:store,

autoExpandColumn:2

});

当然,表格同样能显示xml 格式的数据,假如上面的数据存放成hello.xml 文件中为了把这个xml 数据用ExtJS 的表格Grid 进行显示,我们只需要把store 部分的内容调整成如下的内容即可:

<?xml version="1.0" encoding="UTF-8"?>

<dataset>

<row>

<id>1</id>

<name>EasyJWeb</name>

<organization>EasyJF</organization>

<homepage>www.easyjf.com</homepage>

</row>

<row>

<id>2</id>

<name>jfox</name>

<organization>huihoo</organization>

<homepage>www.huihoo.org</homepage>

</row>

<row>

<id>3</id>

<name>jdon</name>

<organization>jdon</organization>

<homepage>www.jdon.com</homepage>

</row>

<row>

<id>4</id>

<name>springside</name>

<organization>springside</organization>

<homepage>www.springside.org.cn</homepage>

</row>

</dataset>

var store=new Ext.data.Store({

url:"hello.xml",

reader:new Ext.data.XmlReader({

record:"row"},

["id","name","organization","homepage"])

});

其它的部分不用改变,完整的代码如下:

function showUrl(value)

{

return "<a href='http://"+value+"' target='_blank'>"+value+"</a>";

}

Ext.onReady(function(){

var store=new Ext.data.Store({

url:"hello.xml",

reader:new Ext.data.XmlReader({

record:"row"},

["id","name","organization","homepage"])

});

var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},

{header:"开发团队",dataIndex:"organization",sortable:true},

{header:"网址",dataIndex:"homepage",renderer:showUrl}]);

var grid = new Ext.grid.GridPanel({

renderTo:"hello",

title:"中国Java开源产品及团队",

height:200,

width:600,

cm:colM,

store:store,

autoExpandColumn:2

});

store.load();

});

store.load()是用来加载数据,执行上面的代码产生的表格与前面的完全一样

B、可编辑表格

是指可以直接在表格的单元格对表格的数据进行编辑,ExtJS 中的可编辑表格由类Ext.grid.EditorGridPanel 表示,xtype 为editorgrid。使用EditorGridPanel 与使用普通的GridPanel 方式一样,区别只是在定义列信息的时候,可以指定某一列使用的编辑即可,下面来看一个简单的示例。

Ext.onReady(function(){

var data=[{id:1,

name:'小王',

email:'xiaowang@easyjf.com',

sex:'男',

bornDate:'1991-4-4'},

{id:1,

name:'小李',

email:'xiaoli@easyjf.com',

sex:'男',

bornDate:'1992-5-6'},

{id:1,

name:'小兰',

email:'xiaoxiao@easyjf.com',

sex:'女',

bornDate:'1993-3-7'}

];

var store=new Ext.data.JsonStore({

data:data,

fields:["id","name","sex","email",{name:"bornDate",type:"date",dateFormat:"Y-n-j"}]

});

var colM=new Ext.grid.ColumnModel([{

header:"姓名",

dataIndex:"name",

sortable:true,

editor:new Ext.form.TextField()},

{header:"性别",

dataIndex:"sex"

},

{header:"出生日期",

dataIndex:"bornDate",

width:120,

renderer:Ext.util.Format.dateRenderer('Y年m月d日')},

{header:"电子邮件",

dataIndex:"email",

sortable:true,

editor:new Ext.form.TextField()}

]);

var grid = new Ext.grid.EditorGridPanel({

renderTo:"hello",

title:"学生基本信息管理",

height:200,

width:600,

cm:colM,

store:store,

autoExpandColumn:3

});

});

上面的程序首先定义了一个包含学生信息的对象数组,然后创建了一个JsonStore,在创建这个store 的时候,指定bornDate 列的类型为日期date 类型,并使用dateFormat 来指定日期信息的格式为"Y-n-j",Y 代表年,n 代表月,j 代表日期。定义表格列模型的时候,对于”姓名” 及” 电子邮件” 列我们使用editor 来定义该列使用的编辑器, 这里是使用Ext.form.TextField,最后使用new Ext.grid.EditorGridPanel(…)来创建一个可编辑的表格。执行上面的程序可以生成一个表格,双击表格中的”姓名”、或”电子邮件”单元格中的信息可以触发单元格的编辑,可以在单元格的文本框中直接编辑表格中的内容,修改过的单元格会有特殊的标记,

为了能编辑”性别”及”出生日期”列,同样只需要在定义该列的时候指定editor 即可。由于出生日期是日期类型,因此我们可以使用日期编辑器来编辑,”性别”一列的数据不应该让用户直接输入,而应该是通过下拉框进行选择。日期编辑器可以直接使用Ext.form.DateField组件,下拉选择框编辑器可以使用Ext.form.ComboBox 组件,下面是实现对性别及出生日期等列信息编辑的代码:

var colM=new Ext.grid.ColumnModel([{

header:"姓名",

dataIndex:"name",

sortable:true,

editor:new Ext.form.TextField()},

{header:"性别",

dataIndex:"sex",

editor:new Ext.form.ComboBox({transform:"sexList",

triggerAction: 'all',

lazyRender:true})

},

{header:"出生日期",

dataIndex:"bornDate",

width:120,

renderer:Ext.util.Format.dateRenderer('Y年m月d日'),

editor:new Ext.form.DateField({format:'Y年m月d日'})},

{header:"电子邮件",

dataIndex:"email",

sortable:true,

editor:new Ext.form.TextField()}

]);

var grid = new Ext.grid.EditorGridPanel({

renderTo:"hello",

title:"学生基本信息管理",

height:200,

width:600,

cm:colM,

store:store,

autoExpandColumn:3,

clicksToEdit:1

});

注意在定义EditorGridPanel 的时候,我们增加了一个属性”clicksToEdit:1”,表示点击一次单元格即触发编辑,因为默认情况下该值为2,需要双击单元格才能编辑。为了给ComboBox 中填充数据,我们使用设置了该组件的transform 配置属性值为sexList,sexList是一个传统的<select>框,我们需要在html 页面中直接定义,代码如下:

<select>

<option>男</option>

<option>女</option>

</select>

执行上面的程序,我们可以得到一个能对表格中所有数据进行编辑的表格了。点击上面的”性别”一列的单元格时,会出现一个下拉选择框,点击”出生日期”一列的单元格时,会出现一个日期数据选择框

那么如何保存编辑后的数据呢?答案是直接使用afteredit 事件。当对一个单元格进行编辑完之后,就会触发afteredit 事件,可以通过该事件处理函数来处理单元格的信息编辑。当我们编辑一个日志目录的时候,需要把编辑后的数据保存到服务器,代码如下:

this.grid.on("afteredit",this.afterEdit,this);

afterEdit:function(obj){

var r=obj.record;

var id=r.get("id");

var name=r.get("name");

var c=this.record2obj(r);

var tree=this.tree;

var node=tree.getSelectionModel().getSelectedNode();

if(node && node.id!="root")c.parentId=node.id;

if(id=="-1" && name!=""){

topicCategoryService.addTopicCategory(c,function(id){

if(id)r.set("id",id);

if(!node)node=tree.root;

node.appendChild(new Ext.tree.TreeNode({

id:id,

text:c.name,

leaf:true

}));

node.getUI().removeClass('x-tree-node-leaf');

node.getUI().addClass('x-tree-node-expanded');

node.expand();

});

}

else if(name!="")

{

topicCategoryService.updateTopicCategory(r.get("id"),c,function(ret){

if(ret)tree.getNodeById(r.get("id")).setText(c.name);

});

}

}

在实际的应用中,表格中的数据一般都是直接存放在数据库表或服务器的文件中。因此,在使用表格控件的时候经常需要与服务器进行交互。ExtJS 使用Ajax 方式提供了一套与服务器交互的机制,也就是可以不用刷新页面,就可以访问服务器的程序进行数据读取或数据保存等操作。

var store=new Ext.data.Store({

url:"hello.xml",

reader:new Ext.data.XmlReader({

record:"row"},

["id","name","organization","homepage"])

});

因为Store 组件接受一个参数url,如果设置url,则ExtJS 会创建一个与服务器交互的Ext.data.HttpProxy 对象,该对象通过指定的Connection Ext.Ajax.request 来向服务端发送请求,从而可以读取到服务器端的数据。

经验表明,服务器端产生JSon 数据是一种非常不错的选择,也就是说假如服务器的

url”student.ejf?cmd=list”产生下面的JSON 数据输出:

{results:[{id:1,

name:'小王',

email:'xiaowang@easyjf.com',

sex:'男',

bornDate:'1991-4-4'},

{id:1,

name:'小李',

email:'xiaoli@easyjf.com',

sex:'男',

bornDate:'1992-5-6'},

{id:1,

name:'小兰',

email:'xiaoxiao@easyjf.com',

sex:'女',

bornDate:'1993-3-7'}

] }

则前面显示学习信息编辑表格的store 可以创建成下面的形式:

var store=new Ext.data.Store({

url:"student.ejf?cmd=list",

reader:new Ext.data.JsonReader({

root:"result"},

["id","name","organization","homepage"])

});

或者:

var store=new Ext.data.JsonStore({

url:"student.ejf?cmd=list",

root:"result",

fields:["id","name","organization","homepage"]});

其中root 表示包含记录集数据的属性。

如果在运行程序中需要给服务器端发送数据的时候,此时可以直接使用ExtJS 中提供的Ext.Ajax 对象的request 方法。比如下面的代码实现放服务器的student.ejf?cmd=save 这个url发起一个请求,并在params 中指定发送的Student 对象:

var store=new Ext.data.JsonStore({

url:"student.ejf?cmd=list",

root:"result",

fields:["id","name","organization","homepage"]});

function sFn()

{

alert('保存成功');

}

function fFn()

{

alert('保存失败');

}

Ext.Ajax.request({

url: 'student.ejf?cmd=save”

success: sFn

failure: fFn,

params: { name: '小李',email: ' xiaoli@easyjf.com',bornDate: ' 1992-5-6',sex: '男'}

});

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容