ExtJS中表格的特性简介
表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,xtype为grid
表格的列信息由Ext.grid.ColumnModel定义
表格的数据存储器由Ext.data.Store定义,根据解析数据的不同,数据存储器可具体分为如下几种:
JsonStore,SimpleStore,GroupingStore…
一个表格的基本编写过程:
1、创建表格列模型
var cm = new Ext.grid.ColumnModel({
{header: \'角色\', dataIndex: \'role\'},
{header: \'等级\', dataIndex: \'grade\'},
{header: \'创建日期\', dataIndex: \'createDate\', type: \'date\', renderer: Ext.util.Format.dateRenderer(\'Y年m月d日\')} //创建日期类型的数据
});
2、创建数据数组
var data = [ [\'士兵\',\'7\',\'2011-07-2412:34:56\'], [\'将军\',\'10\',\'2011-07-2412:34:56\'], ];
3、创建一个数据存储对象store,包含两部分:proxy,获取数据的方式;reader,解析数据的方式
ArrayReader的mapping用来设置列的排列顺序
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: \'role\', mapping: 1},
{name: \'grade\', mapping: 0}
{name: \'createDate\', mapping: 2, type:\'date\', dateFormat:\'Y-m-dH:i:s\'} //创建日期列和显示格式
])
});
store.load();
4、创建GridPanel,装配ColumnModel和store
var grid = new Ext.grid.GridPanel({
renderTo: \'grid\',
store: store,
cm: cm
});
另外获取远程数据可以使用ScriptTagProxy,如下所示
var store = new Ext.data.Store({
proxy: new Ext.data.ScriptTagProxy({
url:\'http://...\'}),
reader: new Ext.data.ArrayReader({}, [
{name: \'role\', mapping: 1},
{name: \'grade\', mapping: 0}
]),
sortInfo: {field: \"role\", direction: \"ASC\"} //设置默认排序列,ASC/DESC
});
表格的常用属性功能
var grid = new Ext.grid.GridPanel({
enableColumnMove: false, //禁止拖放列
enableColumnResize: false, //禁止改变列的宽度
stripeRows: true, //斑马线效果
loadMask: true, //读取数据时的遮罩和提示功能
renderTo: \'grid\',
store: store
cm: cm
});
var cm = new Ext.grid.ColumnModel({
{header: \'角色\', dataIndex: \'role\', width:90, sortable: true}, //width设置列宽度,默认为100px,sortable设置排序功能
{id:\'grade\', header: \'等级\', dataIndex: \'grade\', width:40}
});
var grid = new Ext.grid.GridPanel({
renderTo: \'grid\',
store: store,
cm: cm
viewConfig:{ //让每列自动填充满表格
forceFit: true
}
autoExpandColumn: \'grade\' //自动延伸列,列的id在ColumnModel中定义
});
渲染表格,为表格设置特殊样式
只需要在cm里面增加一个renderer属性,添加一个自定义函数来渲染传进来(由EXT自动传递)的参数的样式即可,即在返回value之前拼装上相应的HTML和CSS或者JS响应事件。
function renderSex(value) {
if (value == \'male\') {
return \"<span style=\'color:blue;\'>男</span><img src=\'images/icon_male.png\' />\";
} else {
return \"<span style=\'color:red;\'>女</span><img src=\'images/icon_female.png\' />\";
}
}
var cm = new Ext.grid.ColumnModel([
{header:\'id\',dataIndex:\'id\'},
{header:\'name\',dataIndex:\'name\'},
{header:\'sex\',dataIndex:\'sex\',renderer:renderSex},
]);
var data = [
[\'1\',\'Jason\',\'male\'],
[\'2\',\'Kate\',\'female\']
];
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: \'id\'},
{name: \'name\'},
{name: \'sex\'}
])
});
store.load();
var grid = new Ext.grid.GridPanel({
autoHeight: true,
renderTo: \'grid\',
store: store,
cm: cm
});
自动显示行号,只要在创建cm时创建一个RowNumberer就可以了
var cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(), //显示行号
{header:\'id\',dataIndex:\'id\'},
{header:\'name\',dataIndex:\'name\'},
{header:\'sex\',dataIndex:\'sex\',renderer:renderSex},
]);
删除列
store.remove(store.getAt(i));
刷新表格
grid.view.refresh();
为表格添加复选框
需要使用CheckboxSelectionModel
SelectionModel sm在使用时要放到cm和表格中
var sm = new Ext.grid.CheckboxSelectionModel();
var cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),
sm,
{header:\'编号\',dataIndex:\'id\'},
{header:\'名称\',dataIndex:\'name\'}
]);
var data = [
[\'1\',\'name1\'],
[\'2\',\'name2\']
];
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: \'id\'},
{name: \'name\'}
])
});
store.load();
var grid = new Ext.grid.GridPanel({
autoHeight: true,
renderTo: \'grid\',
store: store,
cm: cm,
sm: sm
});
通过RowSelectionModel设置只选择一行:
var grid = new Ext.grid.GridPanel({
autoHeight: true,
renderTo: \'grid\',
store: store,
cm: cm,
sm: new Ext.grid.RowSelectionModel({singleSelect:true})
});
使用选择模型获取数据
grid.on(\'click\', function() {
var selections = grid.getSelectionModel().getSelections();
for (var i = 0; i < selections.length; i++) {
var record = selections[i];
Ext.Msg.alert(record.get(\"id\"));
}
});
表格视图
从MVC的思想来看表格控件:
* Ext.data.Store可看做模型
* Ext.grid.GridPanel可看做控制器
* Ext.grid.GridView可看做视图
* 一般GridView由GridPanell自动生成,如果想设置GridView的属性时,可以通过Ext.grid.GridPanel的getView()获得视图实例
Ext.get(\'button1\').on(\'click\', function() {
grid.getView().scrollToTop();
grid.getView().focusCell(0, 0);
var cell = grid.getView().getCell(0, 0);
cell.style.backgroundColor = \'red\';
});
使用GridPanel的viewConfig在创建表格时设置GridView的初始化参数
var grid = new Ext.grid.GridPanel({
height: 100,
width: 400,
renderTo: \'grid\',
store: new Ext.data.Store({
autoLoad: true,
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, meta)
}),
columns: meta,
viewConfig: {
columnsText: \'显示的列\', //设置下拉菜单提示文字
scrollOffset: 30, //设置右侧滚动条的预留宽度
sortAscText: \'升序\', //设置下拉菜单提示文字
sortDescText: \'降序\', //设置下拉菜单提示文字
forceFit: true //自动延展每列的长度
}
});
为表格添加分页工具条
* 可以使用GridPanel的bbar属性,并创建Ext.PagingToolbar分页工具条对象
* 注意,如果配置了分页工具条,store.load()就必须在构造表格以后执行。
var grid = new Ext.grid.GridPanel({
renderTo: \'grid\',
autoHeight: true,
store: store,
cm: cm,
bbar: new Ext.PagingToolbar({
pageSize: 10, //每页显示10条数据
store: store,
displayInfo: true, //显示数据信息
displayMsg: \'显示第 {0} 条到 {1} 条记录,一共 {2} 条\',
emptyMsg: \"没有记录\" //没有数据时显示的信息
})
});
store.load();
从后台脚本获取分页数据
使用HttpProxy传递请求,获取服务器的JSON数据,交给JsonReader解析
var cm = new Ext.grid.ColumnModel([
{header:\'编号\',dataIndex:\'id\'},
{header:\'名称\',dataIndex:\'name\'}
]);
var store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url:\'page.jsp\'}),
reader: new Ext.data.JsonReader({
totalProperty: \'totalProperty\',
root: \'root\'
}, [
{name: \'id\'},
{name: \'name\'}
])
});
var grid = new Ext.grid.GridPanel({
renderTo: \'grid\',
autoHeight: true, //数据传回来之前高度未知,所以要使用自适应高度
store: store,
cm: cm,
bbar: new Ext.PagingToolbar({
pageSize: 10,
store: store,
displayInfo: true,
displayMsg: \'显示第 {0} 条到 {1} 条记录 / 共 {2} 条\',
emptyMsg: \"没有记录\"
})
});
store.load({params:{start:0,limit:10}});
如果想让分页工具条显示在表格的顶部,可以使用GridPanel的tbar属性设置添加工具条
让ExtJS在对返回的数据进行分页
* 需要在页面中引入examples/locale目录下的PagingMemoryProxy.js文件
* 再使用PagingMemoryProxy设置代理
var store = new Ext.data.Store({
proxy: new Ext.data.PagingMemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: \'id\'},
{name: \'name\'},
{name: \'descn\'}
])
});
//在创建GridPanel之后调用
store.load({params:{start:0,limit:3}});
可编辑表格控件EditorGrid的使用
制作一个简单的EditorGrid的步骤:
1、定义列ColumnModel,在里面添加editor属性
var cm = new Ext.grid.ColumnModel([{
header: \'编号\',
dataIndex: \'id\',
editor: new Ext.grid.GridEditor(
new Ext.form.TextField({
allowBlank: false //不允许在TextField中输入空值
})
)
}, {
header: \'名称\',
dataIndex: \'name\',
editor: new Ext.grid.GridEditor(
new Ext.form.TextField({
allowBlank: false
})
)
}]);
2、准备一个数组
var data = [ [\'1\',\'Jason\'], [\'2\',\'Jay\'] ];
3、创建Ext.data.Store,设置内存代理,设置ArrayReader解析数组
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: \'id\'},
{name: \'name\'}
])
});
4、加载数据,创建EditorGridPanel
store.load();
var grid = new Ext.grid.EditorGridPanel({
autoHeight: true,
renderTo: \'grid\',
store: store,
cm: cm
});
为可编辑表格添加和删除数据
1、使用Record的create方法创建一个记录集MyRecord,MyRecord相当于一个类
var MyRecord = Ext.data.Record.create([
{name: \'id\', type: \'string\'},
{name: \'name\', type: \'string\'}
]);
store.load();
2、创建EditorGridPanel面板,在属性tbar中创建Ext.Toolbar
var grid = new Ext.grid.EditorGridPanel({
autoHeight: true,
renderTo: \'grid\',
store: store,
cm: cm,
tbar: new Ext.Toolbar([\'-\', { //-表示菜单分隔符
text: \'添加一行\',
handler: function(){
var p = new MyRecord({
id:\'\',
name:\'\'
});
grid.stopEditing(); //关闭表格的编辑状态
store.insert(0, p); //创建的Record插入store的第一行
grid.startEditing(0, 0); //激活第一行第一列的编辑状态
}
}, \'-\', {
text: \'删除一行\',
handler: function(){
Ext.Msg.confirm(\'信息\', \'确定要删除?\', function(btn){
if (btn == \'yes\') {
var sm = grid.getSelectionModel(); //获取表格的选择模型
var cell = sm.getSelectedCell(); //获取选中的单元格
var record = store.getAt(cell[0]); //通过行号得到store这一行对应的Record
store.remove(record); //移除数据
}
});
}
}, \'-\'])
});
为可编辑表格保存修改的结果
在上面例子的基础之上,添加一个保存按钮
text: \'保存\',
handler: function(){
var m = store.modified.slice(0); //获得store中修改过得数据
for (var i = 0; i < m.length; i++) { //验证表格信息是否正确,是否包含空格
var record = m[i];
var fields = record.fields.keys;
for (var j = 0; j < fields.length; j++) {
var name = fields[j];
var value = record.data[name];
var colIndex = cm.findColumnIndex(name);
var rowIndex = store.indexOfId(record.id);
var editor = cm.getCellEditor(colIndex).field;
if (!editor.validateValue(value)) {
Ext.Msg.alert(\'提示\', \'请检查输入的数据是否正确!\', function(){
grid.startEditing(rowIndex, colIndex);
});
return;
}
}
}
var jsonArray = [];
Ext.each(m, function(item) {
jsonArray.push(item.data); //把修改过得数据放到jsonArray中
});
Ext.lib.Ajax.request( //使用Ajax请求提交给后台
\'POST\',
\'save_data.jsp\',
{success: function(response){ //返回成功
Ext.Msg.alert(\'信息\', response.responseText, function(){
store.reload();
});
},failure: function(){ //返回失败
Ext.Msg.alert(\"错误\", \"服务器保存数据出错!\");
}},
\'data=\' + encodeURIComponent(Ext.encode(jsonArray))
);
}
另外store可以设置属性pruneModifiedRecords: true。这样,每次remove或load操作时store会自动清除modified标记,可以避免出现下次提交时还会把上次那些modified信息都带上的现象。
限制表格输入的数据类型
NumberField
{
header:\'ID\',
dataIndex:\'id\',
editor:new Ext.grid.GridEditor(new Ext.form.NumberField({ //NumberField限制只能输入数字
allowBlank: false,
allowNegative: false, //不能输入减号
maxValue: 10
}))
}
ComboBox
var comboData = [
[\'0\',\'Java\'],
[\'1\',\'Android\']
];
{
header:\'ComboBox\',
dataIndex:\'combo\',
editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({
store: new Ext.data.SimpleStore({
fields:[\'value\',\'text\'],
data: comboData
}),
emptyText: \'请选择\',
mode: \'local\',
triggerAction: \'all\',
valueField: \'value\',
displayField: \'text\',
readOnly:true
})),
renderer: function(value){
return comboData[value][1];
}
}
DateField
{
header:\'Date\',
dataIndex:\'date\',
editor:new Ext.grid.GridEditor(new Ext.form.DateField({
format: \'Y-m-d\',
minValue: \'2011-07-24\',
disabledDays: [0, 6],
disabledDaysText: \'选择周一到周六之间的日期\'
})),
renderer: function(value) {
return value.format(\"Y-m-d\");
}
}
属性表格控件PropertyGrid的使用
是在EditorGrid的基础上开发的更智能的高级表格组件
var grid = new Ext.grid.PropertyGrid({
title: \'属性表格控件PropertyGrid\',
autoHeight: true,
width: 400,
renderTo: \'grid\',
viewConfig: {
forceFit: true
},
source: {
\"String\": \"String\",
\"Date\": new Date(Date.parse(\'07/24/2011\')),
\"boolean\": false,
\"float\": .01
}
});
禁用PropertyGrid编辑功能的方法
grid.on(\'beforeedit\', function(e){
e.cancel = true;
return false;
});
根据表格的name获取value
grid.store.getById(\'Jason\').get(value);
ExtJS中实现嵌套表格
先看效果:
代码如下:
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html>
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<title>test</title>
<script type=\"text/javascript\">
</script>
<link rel=\"stylesheet\" type=\"text/css\" href=\"Lib/ExtJs/2_2/resources/css/ext-all.css\" />
<script type=\"text/javascript\" src=\"Lib/ExtJs/2_2/adapter/ext/ext-base.js\"></script>
<script type=\"text/javascript\" src=\"Lib/ExtJs/2_2/ext-all-debug.js\"></script>
<script type=\"text/javascript\" src=\"Lib/ExtJs/2_2/source/locale/ext-lang-zh_CN.js\"></script>
<script type=\"text/javascript\" src=\"Lib/ExtJs/plus/RowExpander.js\"></script>
<script type=\"text/javascript\">
Ext.onReady(function(){
var testData=[
[\"lugreen\",\"男\",26,[[\"数学\",100],[\"语文\",150]]]
,[\"lisi\",\"男\",25,[[\"数学\",100],[\"语文\",150]]]
,[\"zhangsan\",\"男\",27,[[\"数学\",120],[\"语文\",158]]]
];
//
storeTest= new Ext.data.SimpleStore({
fields: [\"name\",\"sex\",\"age\",\"grade\"]
,data: testData
});
var expander = new Ext.grid.RowExpander({
tpl : new Ext.XTemplate(
\'<div class=\"detailData\">\',
\'\',
\'</div>\'
)
});
expander.on(\"expand\",function(expander,r,body,rowIndex){
//查找 grid
window.testEle=body;
//alert(body.id);
if (Ext.DomQuery.select(\"div.x-panel-bwrap\",body).length==0){
//alert(\"a\");
var data=r.json[3];
var store=new Ext.data.SimpleStore({
fields: [\"class\",\"degrade\"]
,data:data
});
var cm = new Ext.grid.ColumnModel([
{header: \"科目\",dataIndex: \'class\',width: 130,hideable:false,sortable:false,resizable:true}
,{header: \"成绩\",dataIndex: \'degrade\',width: 130,hideable:false,sortable:false,resizable:true}
]);
Ext.DomQuery.select(\"div.detailData\")[0];
var grid = new Ext.grid.GridPanel(
{
store:store,
cm:cm,
renderTo:Ext.DomQuery.select(\"div.detailData\",body)[0],
autoWidth:true,
autoHeight:true
}
);
}
});
//var sm=new Ext.grid.CheckboxSelectionModel({singleSelect:true});
var cm = new Ext.grid.ColumnModel([
expander
,{header: \"姓名\",dataIndex: \'name\',width: 50,hideable:false,sortable:false}
,{header: \"性别\",dataIndex: \'sex\',width: 130,hideable:false,sortable:false,resizable:true}
,{header: \"年龄\",dataIndex: \'age\',width: 130,hideable:false,sortable:false,resizable:true}
]);
var grid = new Ext.grid.GridPanel(
{
id:\'testgrid\',
store:storeTest,
cm:cm,
renderTo:\"grid1\",
width:780,
autoHeight:false,
height:300,
listeners:{},
plugins:[expander]
}
);
});
</script>
<style type=\"text/css\">
#div2 h2 {
font-weight:200;
font-size:12px;
}
.c1 h2 {
font-weight:200;
}
</style>
</head>
<body>
<div id=\"grid1\">
</div>
<div id=\"grid2\">
</div>
</body>
</html>
其中使用到的\"RowExpander.js\"为extjs官方示例中自带的。
实现这个嵌套表格要注意两点技巧:
1.提供给外层表格的dataStore的数据源以嵌套数组的形式表示细节区的数据,如下面的黑体所示。
var testData=[ [\"lugreen\",\"男\",26,[[\"数学\",100],[\"语文\",150]]] ,[\"lisi\",\"男\",25,[[\"数学\",100],[\"语文\",150]]] ,[\"zhangsan\",\"男\",27,[[\"数学\",120],[\"语文\",158]]] ];
使用数组集中record对象的json属性来获取以细节区数据
var data=r.json[3];
2.在rowExpander的 expand事件中添加嵌套表格.
本文地址:https://www.stayed.cn/item/22191
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我