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 text列修改过 数据的更多相关文章

  1. 如何把mysql的列修改成行显示数据简单实现

    如何把mysql的列修改成行显示数据简单实现 创建测试表: 1: DROP TABLE IF EXISTS `test`; 2: CREATE TABLE `test` ( 3: `year` int ...

  2. nodejs 通过 get获取数据修改redis数据

    如下代码是没有报错的正确代码 我通过https获取到数据 想用redis set一个键值存储 现在我掉入了回调陷阱res.on 里面接收到的数据是data 里面如果放入 client.on('conn ...

  3. 获取DataGridview中某列的所有数据

    /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam& ...

  4. jQuery获取Table某列的值

    在写此篇博文时,发现在以前曾写过<获取DataTable选择第一行某一列值>http://www.cnblogs.com/insus/p/5434062.html . 但是与此篇所说的完全 ...

  5. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  6. 解决无法获取 GridView 隐藏列值问题

    今天遇到了一个要获取GridView隐藏列值的问题,试了好几种方法,要么获取不到,要么获取到了类列的值也隐藏了,但在样式中这一列会多出一块,,但最后找到了一个功能实现而且实现了列完美隐藏的方法和大家分 ...

  7. unity3d在Android端读取修改Json数据

    首先我们需要下载一个文件 LitJson.dll(下载链接 ps: 是用自己的百度云盘下载的如果链接过时,请留言或自行下载, 密码: 5foa) 另外,由于我们要发布到安卓手机上,所以需要配置Jar和 ...

  8. 【Android Developers Training】 100. 使用Intent修改联系人数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Http协议详解,获取doPost,doGet提交的数据,以及编码问题

    一 什么是Http协议 http协议: 浏览器客户端 和  服务器端 之间数据传输的格式规范 二 如何查看Http协议的内容 1)使用火狐的firebug插件(右键->firebug->网 ...

随机推荐

  1. 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学、女性课程、高级研修班、心理学、EWP_培训通课程

    复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学.女性课程.高级研修班.心理学.EWP_培训通课程 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期)    学      ...

  2. Android系统移植与调试之------->如何修改Android设备的开机第一阶段Logo

    1.切换到~/mx0831-0525/device/other/TBDG1073/res_pack目录下 2.更换bootup和poweron文件 找一张bmp16位的图片去除后缀名将这两张都替换,转 ...

  3. javascript时间处理方法收集

    首先收集到的是一个给某一个时间对象增加一段时间的方法, 例如2026-05-11增加一个月的时间,增加后时间为2026-05-11, 代码如下: function DateAdd(interval,n ...

  4. Colorbox cannot load the image added by js

    As we know, Colorbox is a wonderful js plugin. I came up against a head-banged problem in v1.5.6. Wh ...

  5. Eclipse配置Hadoop开发环境

    Step 1:选择Hadoop版本对应的Eclipse插件jar包(可自行编译),我的Hadoop版本是hadoop-0.20.2,对应的插件应该是:hadoop-0.20.2-eclipse-plu ...

  6. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

  7. 指针直接赋值为整型AND利用宏定义求结构体成员偏移量

    首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的. ...

  8. Linux学习之给指定用户发邮件

    发送邮件 进入 mail 程序后的操作都很简单,但是可以不进入 mail 的 & 操作提示符界面,下面举几个实用例子: 1.给 snailwarrior@qq.com 发信 [root@pps ...

  9. Struts2中ModelDriven的使用

    它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...

  10. Android Studio git ignore

    # Built application files *.apk *.ap_ # Files for the Dalvik VM *.dex # Java class files *.class # G ...