Ext2.0的Grid控件学习

Posted by 蒋波涛 22 January,2008 Views (4)Comment

  最近空闲时间在学习Ext2.0框架,只有一个字“强”,我从未想到JS代码能够写出这么绚丽的Web页面出来,以前看到YUI,警若天人,如今看到EXT2.0的东西,更是感觉震撼。

  Ext2.0是一个JS框架,它的Grid控件和其它可以显示数据的空间,能够支持多种数据类型,如二维数组、Json数据和XML数据,甚至包括我们自定义的数据类型。Ext为我们提供了一个桥梁Ext.data.Store,通过它我们可以把任何格式的数据转化成grid可以使用的形式,这样就不需要为每种数据格式写一个grid的实现了。

  首先,一个表格应该有列定义,即定义表头ColumnModel:
// 定义一个ColumnModel
var cm = new Ext.grid.ColumnModel([
    {header:
'编号',dataIndex:'id'
},
    {header:
'性别',dataIndex:'sex'
},
    {header:
'名称',dataIndex:'name'
},
    {header:
'描述',dataIndex:'descn'
}
]);
cm.defaultSortable 
= true
;
    该ColumnModel定义了表格的四个列,其每列的名称和对应的数据键。请注意defaultSortable属性,即为每个列都安上一个可以排序的功能。如果只想某些列举有该功能,可以设置:
{header:'编号',dataIndex:'id',Sortable:true},

  现在就来看看这个Ext.data.Store是如何转换三种数据的。

二维数组:
// ArrayData
var data = [
    [
'1','male','name1','descn1'
],
    [
'2','male','name1','descn2'
],
    [
'3','male','name3','descn3'
],
    [
'4','male','name4','descn4'
],
    [
'5','male','name5','descn5'
]
];
// ArrayReader
var ds = new Ext.data.Store({
    proxy: 
new
 Ext.data.MemoryProxy(data),
    reader: 
new
 Ext.data.ArrayReader({}, [
        {name: 
'id',mapping: 0
},
        {name: 
'sex',mapping: 1
},
        {name: 
'name',mapping: 2
},
        {name: 
'descn',mapping: 3
}
    ])
});
ds.load();
  ds要对应两个部分:proxy和reader。proxy告诉我们从哪里获得数据,reader告诉我们如何解析这个数据。
现在用的是Ext.data.MemoryProxy,它将内存中的数据data作为参数传递。Ext.data.ArrayReader专门用来解析数组,并且告诉我们它会按照定义的规范进行解析,每行按顺序读取四个数据,第一个叫id,第二个叫sex,第三个叫name,第四个descn。这些是跟cm定义中的dataIndex对应的。这样cm就知道哪列应该显示那条数据了。
  mapping属性用于标记data中的读取后的数据与标头的映射关系,一般是不用设置的。但如果我们想让sex的数据中name栏中出现,可以设置mapping值。即id的mapping为2,后者为0。
  记得要执行一次ds.load(),对数据进行初始化。

  数据的显示显得非常简单:

HTML文件:
<div id='grid'></div>
JS文件:
var grid = new Ext.grid.GridPanel({
    el: 
'grid'
,
    ds: ds,
    cm: cm
});
grid.render();

其显示结果为:

如何在表格中添加CheckBox呢?

var sm = new Ext.grid.CheckboxSelectionModel();

var cm = new Ext.grid.ColumnModel([
    new Ext.grid.RowNumberer(),//自动行号
    sm,//添加的地方
    {header:'编号',dataIndex:'id'},
    {header:'性别',dataIndex:'sex'},
    {header:'名称',dataIndex:'name'},
    {header:'描述',dataIndex:'descn'}
]);

var grid = new Ext.grid.GridPanel({
    el: 'grid3',
    ds: ds,
    cm: cm,
    sm: sm,//添加的地方
    title: 'HelloWorld'
});

 如何做Grid上触发事件呢?下面是一个cellclick事件
grid.addListener('cellclick', cellclick);
function cellclick(grid, rowIndex, columnIndex, e) {
    var record = grid.getStore().getAt(rowIndex);   //Get the Record
    var fieldName = grid.getColumnModel().getDataIndex(columnIndex);  //Get field name
    var data = record.get(fieldName);
    Ext.MessageBox.alert('show','当前选中的数据是'+data);
}

如何做Grid中做出快捷菜单效果:
grid.addListener('rowcontextmenu', rightClickFn);//右键菜单代码关键部分
var rightClick = new Ext.menu.Menu({
    id:'rightClickCont',  //在HTML文件中必须有个rightClickCont的DIV元素
    items: [
        {
            id: 'rMenu1',
            handler: rMenu1Fn,//点击后触发的事件
            text: '右键菜单1'
        },
        {
            //id: 'rMenu2',
            //handler: rMenu2Fn,
            text: '右键菜单2'
        }
    ]
});
function rightClickFn(grid,rowindex,e){
    e.preventDefault();
    rightClick.showAt(e.getXY());
}
function rMenu1Fn(){
   Ext.MessageBox.alert('right','rightClick');
}

其Grid如下:
 

如何将一列中的数据根据要求进行改变呢,比如说性别字段根据其male或female改变显示的颜色,这种ColumnMode中设计:
var cm = new Ext.grid.ColumnModel([
    new Ext.grid.RowNumberer(),
    sm,
    {header:'编号',dataIndex:'id'},
    {header:'性别',dataIndex:'sex',renderer:changeSex},
    {header:'名称',dataIndex:'name'},
    {header:'描述',dataIndex:'descn'}
]);
cm.defaultSortable = true;

function changeSex(value){
    if (value == 'male') {
        return "<span style='color:red;font-weight:bold;'>红男</span>";
    } else {
        return "<span style='color:green;font-weight:bold;'>绿女</span>";
    }
}

Related Items

Categories : Ajax Tags : AJAX  
Comments
2008-4-29 22:10:11

var cm = new Ext.grid.ColumnModel([
{header:'编号',dataIndex:'name'},
{header:'性别',dataIndex:'descn'},
{header:'名称',dataIndex:'id'},
{header:'描述',dataIndex:'sex'}
]);
请问博主,将dataIndex的部分代码调换一下,其余不改动。则执行后的grid 是如何显示的?(我将编号和名称对调,性别和描述对调。)这个调换之后的执行结果我想不明白,请你解释一下!

Posted by ext的小草 Gravatar Icon

2008-4-30 11:38:26

昨天我问的问题今天显示正常了

Posted by ext的小草 Gravatar Icon

2009-1-16 17:46:11

我照着这些步骤做 可最后只显示了表头 数据没有 是怎么回事呢?

Posted by liyulu Gravatar Icon

2009-1-16 17:58:47

不可能吧,另外,现在已经有Extjs的书了,可以买本看看

Posted by 蒋波涛 Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档