制作一个简单的Grid

 1ExtJs----Grid笔记_数据var cm = new Ext.grid.ColumnModel([
 2ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'编号',dataIndex:'id'},
 3ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'名称',dataIndex:'name'},
 4ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'描述',dataIndex:'desc'}
 5ExtJs----Grid笔记_数据]);
 6ExtJs----Grid笔记_数据
 7ExtJs----Grid笔记_数据var data = [
 8ExtJs----Grid笔记_数据    [1,'name1','desc1'],
 9ExtJs----Grid笔记_数据    [2,'name2','desc2'],
10ExtJs----Grid笔记_数据    [3,'name3','desc3'],
11ExtJs----Grid笔记_数据    [4,'name4','desc4'],
12ExtJs----Grid笔记_数据    [5,'name5','desc5']
13ExtJs----Grid笔记_数据];
14ExtJs----Grid笔记_数据
15ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var store = new Ext.data.Store(ExtJs----Grid笔记_拖拽_04{
16ExtJs----Grid笔记_css_24    proxy:new Ext.data.MemoryProxy(data),
17ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    reader:new Ext.data.ArrayReader(ExtJs----Grid笔记_拖拽_04{},[
18ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{name:'id'},
19ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{name:'name'},
20ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{name:'desc'}
21ExtJs----Grid笔记_css_24    ])
22ExtJs----Grid笔记_拖拽_38}
);
23ExtJs----Grid笔记_数据
24ExtJs----Grid笔记_数据store.load();
25ExtJs----Grid笔记_数据
26ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var grid = new Ext.grid.GridPanel(ExtJs----Grid笔记_拖拽_04{
27ExtJs----Grid笔记_css_24    height:600,
28ExtJs----Grid笔记_css_24    renderTo:'grid',
29ExtJs----Grid笔记_css_24    store:store,
30ExtJs----Grid笔记_css_24    cm:cm
31ExtJs----Grid笔记_拖拽_38}
);

Grid常用功能详解
    
enableColumnMove : true/false  //是否可拖放列
    enableColumnResize : true/false  //是否可以改变列的宽度
    stripeRows : true/false  //斑马线效果
    如果需要每列自动填满Grid,可以使用viewConfig配置中的foreceFit。即:

1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var grid = new Ext.grid.GridPanel(ExtJs----Grid笔记_拖拽_04{
2ExtJs----Grid笔记_css_24    height:600,
3ExtJs----Grid笔记_css_24    renderTo:'grid',
4ExtJs----Grid笔记_css_24    store:store,
5ExtJs----Grid笔记_css_24    cm:cm,
6ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    viewConfig:ExtJs----Grid笔记_拖拽_04{
7ExtJs----Grid笔记_css_24        forceFit:true
8ExtJs----Grid笔记_右键_61    }

9ExtJs----Grid笔记_拖拽_38}
);

    Gird支持中文排序需要重写Ext.data.Store的applySort函数:

 1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03Ext.data.Store.prototype.applySort = function() ExtJs----Grid笔记_拖拽_04{
 2ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    if (this.sortInfo && !this.remoteSort) ExtJs----Grid笔记_拖拽_04{
 3ExtJs----Grid笔记_css_24        var s = this.sortInfo, f = s.field;
 4ExtJs----Grid笔记_css_24        var st = this.fields.get(f).sortType;
 5ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        var fn = function(r1,r2)ExtJs----Grid笔记_拖拽_04{
 6ExtJs----Grid笔记_css_24            var v1 = st(r1.data[f]), v2=st(r2.data[f]);
 7ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26            if (typeof(v1) == "string")ExtJs----Grid笔记_拖拽_04{
 8ExtJs----Grid笔记_css_24                return v1.localeCompare(v2);
 9ExtJs----Grid笔记_右键_61            }

10ExtJs----Grid笔记_css_24            return v1 > v2 ? 1: (v1 < v2 ? -1 : 0)
11ExtJs----Grid笔记_右键_61        }
;
12ExtJs----Grid笔记_css_24        this.data.sort(s.direction,fn);
13ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        if (this.snapshot && this.snapshot != this.data) ExtJs----Grid笔记_拖拽_04{
14ExtJs----Grid笔记_css_24            this.snapshot.sort(s.direction, fn);
15ExtJs----Grid笔记_右键_61        }

16ExtJs----Grid笔记_右键_61    }

17ExtJs----Grid笔记_拖拽_38}
;

在单元格中显示红色的字、图片和按钮

 1ExtJs----Grid笔记_数据var cm = new Ext.grid.ColumnModel([
 2ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'编号',dataIndex:'id'},
 3ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'名称',dataIndex:'name'},
 4ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'性别',dataIndex:'sex',renderer:function(value)ExtJs----Grid笔记_拖拽_04{
 5ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        if (value == 'male') ExtJs----Grid笔记_拖拽_04{
 6ExtJs----Grid笔记_css_24            return "<span style='color:red;font-weight:bold;'>红男</span><img src='user_male.png'/>"
 7ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        }
 else ExtJs----Grid笔记_拖拽_04{
 8ExtJs----Grid笔记_css_24            return "<span style='color:green;font-weight:bold;'>绿女</span><img src='user_female.png'/>"
 9ExtJs----Grid笔记_右键_61        }

10ExtJs----Grid笔记_拖拽_38    }
}
,
11ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{header:'描述',dataIndex:'desc',renderer:fn}
12ExtJs----Grid笔记_数据]);
13ExtJs----Grid笔记_数据
14ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var fn = function(value, cellmeta, record, rowIndex, columnIndex, store)ExtJs----Grid笔记_拖拽_04{
15ExtJs----Grid笔记_css_24    var str = "<input type='button' value='查看详细信息' onclick='alert(\""+
16ExtJs----Grid笔记_css_24        "这个单元格的值是: " + value + "\\n" +
17ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        "这个单元格的配置是: ExtJs----Grid笔记_拖拽_04{cellId" + cellmeta.cellId + ",Id:" + cellmeta.id + ",css:" + cellmeta.css + "}\\n" +
18ExtJs----Grid笔记_css_24        "这个单元格对应行的record是:" + record + ", 一行的数据都在里面\\n" + 
19ExtJs----Grid笔记_css_24        "这是第" + rowIndex + "行\\n" +
20ExtJs----Grid笔记_css_24        "这是第" + columnIndex + "列\\n" +
21ExtJs----Grid笔记_css_24        "这个表格对应的Ext.data.Store在这里:" + store + ", 随便用吧。" +
22ExtJs----Grid笔记_css_24        "\")'>";
23ExtJs----Grid笔记_css_24    return str;
24ExtJs----Grid笔记_拖拽_38}

给Grid的行和列设置颜色
ExtJs----Grid笔记_数据//设置行的颜色
ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03
viewConfig:ExtJs----Grid笔记_拖拽_04{
ExtJs----Grid笔记_css_24    forceFit:
true,
ExtJs----Grid笔记_css_24    enableRowBody:
true,
ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    getRowClass:
function(record,rowIndex,p,ds)ExtJs----Grid笔记_拖拽_04{
ExtJs----Grid笔记_css_24        
var cls = 'white-row';
ExtJs----Grid笔记_css_24        
if (record.data.id % 2 == 0)
ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        
ExtJs----Grid笔记_拖拽_04{
ExtJs----Grid笔记_css_24            cls 
= 'red-row'
ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        }
 else ExtJs----Grid笔记_拖拽_04{
ExtJs----Grid笔记_css_24            cls 
= 'yellow-row'
ExtJs----Grid笔记_右键_61        }

ExtJs----Grid笔记_css_24        
return cls;
ExtJs----Grid笔记_右键_61    }

ExtJs----Grid笔记_拖拽_38}

1ExtJs----Grid笔记_数据//修改列的颜色,使用renderer属性配置如下方法
2ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var fn = function(value, cellmeta, record, rowIndex, columnIndex, store)ExtJs----Grid笔记_拖拽_04{
3ExtJs----Grid笔记_css_24    var value = record.get('color');
4ExtJs----Grid笔记_css_24    cell.attr = "style=background-color:" + value;
5ExtJs----Grid笔记_css_24    return data;
6ExtJs----Grid笔记_拖拽_38}

    当然,如果只想修改Grid某一行的样式,还可以用grid.getView().addRowClass(r,css);修改Grid某一单元格的样式,可以用Ext.get(grid.getView().getCell(r,c)).addClass(css)或grid.getVies().getRow(r).style.backgroundColor = "red"。

选择模型
    
当单击某一单元格时,需要被选中的为整行,则使用RowSelectionModel----行选择模型。行选择模型默认是支持多选的,如只能单选,需要设置singleSelect参数。

1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var grid = new Ext.grid.GridPanel (ExtJs----Grid笔记_拖拽_04{
2ExtJs----Grid笔记_css_24    renderTo : 'grid',
3ExtJs----Grid笔记_css_24    store : store,
4ExtJs----Grid笔记_css_24    cm : cm,
5ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    sm : new Ext.grid.RowSelectionModel(ExtJs----Grid笔记_拖拽_04{singleSelect:true})
6ExtJs----Grid笔记_拖拽_38)}
;

表格视图---Ext.grid.GridView
   
Ext的表格控件都遵循MVC模型,Ext.data.Store可看做Model模型,Ext.grid.GridPanel中设置各种监听器可看做Controller控制器,而Ext.grid.GridView对应的就是View视图。通常情况下,不需要自行创建Ext.grid.GridView的实例,GridPanel会自行生成对应的实例,并可通过getView()函数来获取当前表格使用的视图实例。

1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03Ext.get('scroll').on('click',function()ExtJs----Grid笔记_拖拽_04{
2ExtJs----Grid笔记_css_24    grid.getView().scrollToTop();
3ExtJs----Grid笔记_拖拽_38}
)

    当然,我们也可以为GridView设置初始参数:

1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03viewConfig:ExtJs----Grid笔记_拖拽_04{
2ExtJs----Grid笔记_css_24    columnsText:'显示的列',
3ExtJs----Grid笔记_css_24    scrollOffset:30,  //表格右侧滚动条的宽度,默认是20px
4ExtJs----Grid笔记_css_24    sortAscText:'升序',
5ExtJs----Grid笔记_css_24    sortDescText:'降序',
6ExtJs----Grid笔记_css_24    forceFit:true
7ExtJs----Grid笔记_拖拽_38}

后台排序
    
Grid的后台排序只需在配置Ext.data.Store的时候配置remoteSort:true即可,这样下次排序的时候,Store会向后台提交两个参数:sort和dir。sort表示需要排序的字段,dir表示升序或降序(ASC/DESC)。

属性表格控件----PropertyGrid

 1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var gird = new Ext.grid.PropertyGrid(ExtJs----Grid笔记_拖拽_04{
 2ExtJs----Grid笔记_css_24    title:'属性表格',
 3ExtJs----Grid笔记_css_24    autoHeight:true,
 4ExtJs----Grid笔记_css_24    width:300,
 5ExtJs----Grid笔记_css_24    renderTo:'grid1',
 6ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    source:ExtJs----Grid笔记_拖拽_04{
 7ExtJs----Grid笔记_css_24        "名字":"不告诉你",
 8ExtJs----Grid笔记_css_24        "创建时间":new Date(Date.parse('12/15/2007')),
 9ExtJs----Grid笔记_css_24        "是否有效":false,
10ExtJs----Grid笔记_css_24        "版本号":.01,
11ExtJs----Grid笔记_css_24        "描述":"恩,估计没有啥可说的"
12ExtJs----Grid笔记_右键_61    }

13ExtJs----Grid笔记_拖拽_38}
);

        上述代码就很容易地构建出一个可编辑的Grid,且各个字段的编辑器都是对应的。如果需要只能看不能动的PropertyGrid,则:

1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03grid.on("beforeedit",function(e)ExtJs----Grid笔记_拖拽_04{
2ExtJs----Grid笔记_css_24    e.cancel = true;
3ExtJs----Grid笔记_css_24    return false;
4ExtJs----Grid笔记_拖拽_38}
);

    如果需要强制对name列排序,则需要修改Ext.grid.PropertyGrid.prototype.initComponent源码,将store.store.sort('name','ASC')注释掉即可。
    下面示例了自定义编辑器的代码:

 1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var grid = new Ext.grid.PropertyGrid(ExtJs----Grid笔记_拖拽_04{
 2ExtJs----Grid笔记_css_24    title:'表格属性',
 3ExtJs----Grid笔记_css_24    autoHeight:true,
 4ExtJs----Grid笔记_css_24    width:300,
 5ExtJs----Grid笔记_css_24    renderTo:'grid',
 6ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    customEditors:ExtJs----Grid笔记_拖拽_04{
 7ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        'Start Time':new Ext.grid.GridEditor(new Ext.form.TimeField(ExtJs----Grid笔记_拖拽_04{selectOnFocus:true}))
 8ExtJs----Grid笔记_右键_61    }
,
 9ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    soruce:ExtJs----Grid笔记_拖拽_04{
10ExtJs----Grid笔记_css_24        'Start Time':'10:00 AM'
11ExtJs----Grid笔记_右键_61    }

12ExtJs----Grid笔记_拖拽_38}
);

分组表格控件----Group

 1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var reader = new Ext.data.ArrayReader(ExtJs----Grid笔记_拖拽_04{},[
 2ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{name:'id'},
 3ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{name:'sex'},
 4ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{name:'name'},
 5ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03    ExtJs----Grid笔记_拖拽_04{name:'desc'}
 6ExtJs----Grid笔记_数据]);
 7ExtJs----Grid笔记_数据
 8ExtJs----Grid笔记_数据var data = [
 9ExtJs----Grid笔记_数据    [1,'male','name1','descn1'],
10ExtJs----Grid笔记_数据    [2,'female','name2','descn2'],
11ExtJs----Grid笔记_数据    [3,'male','name3','descn3'],
12ExtJs----Grid笔记_数据    [4,'female','name4','descn4'],
13ExtJs----Grid笔记_数据    [5,'male','name5','descn5']
14ExtJs----Grid笔记_数据];
15ExtJs----Grid笔记_数据
16ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var store = new Ext.data.GroupingStore(ExtJs----Grid笔记_拖拽_04{
17ExtJs----Grid笔记_css_24    reader:reader,
18ExtJs----Grid笔记_css_24    data:data,
19ExtJs----Grid笔记_css_24    groupField:'sex',
20ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    sortInfo:ExtJs----Grid笔记_拖拽_04{field:'id',direction:"ASC"}
21ExtJs----Grid笔记_拖拽_38}
);
22ExtJs----Grid笔记_数据
23ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var grid = new Ext.grid.GridPanel(ExtJs----Grid笔记_拖拽_04{
24ExtJs----Grid笔记_css_24    store:store,
25ExtJs----Grid笔记_css_24    height:300,
26ExtJs----Grid笔记_css_24    columns:[
27ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{header:'编号',dataIndex:'id'},
28ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{header:'性别',dataIndex:'sex'},
29ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{header:'名称',dataIndex:'name'},
30ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{header:'描述',dataIndex:'desc'}
31ExtJs----Grid笔记_css_24    ],
32ExtJs----Grid笔记_css_24    view:new Ext.grid.GroupingView(),
33ExtJs----Grid笔记_css_24    renderTo:'grid'
34ExtJs----Grid笔记_拖拽_38}
);
    
    上述示例需要关注的是groupField,确定通过哪一项分组。令人困惑的是,GroupingStore要求必须设置sortInfo。同样,也可以通过grid.getView()来获取到Ext.grid.GroupingView的实例。

可拖放的表格
    
1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var rz = new Ext.Resizable('grid',ExtJs----Grid笔记_拖拽_04{
2ExtJs----Grid笔记_css_24    wrap:true,
3ExtJs----Grid笔记_css_24    minHeight:100,
4ExtJs----Grid笔记_css_24    pinned:true,
5ExtJs----Grid笔记_css_24    handles:'s'
6ExtJs----Grid笔记_拖拽_38}
);
7ExtJs----Grid笔记_数据
8ExtJs----Grid笔记_数据rz.on('resize',grid.syncSize,grid);
    
    Resizable必须放在render之后,否则会出现问题。参数的构成:
    第一个参数'grid':就是说这个可改变大小的条是在div id="grid"这个元素上起作用。
    wrap:true  这个参数会在构造Resizable时自动在指定id的外部包裹一层div。
    minHeight:100  限制改变大小的最小高度。
    pinned:true    pinned就是显示蓝色细线和上面的三个小点,突出提示。如果为true,则一直显示;false则只当鼠标放到上面时才出现。
    handles:'s'    's'即'south'。Ext中的东南西北对应上下左右,用来设置拖动的方向。

在同一个表格里拖放
    
只需将grid的属性enableDragDrop设置为true,表格就支持了拖拽。但这样还不能实现真正意义上的拖拽,总会显示一个禁止放下的图标。这是因为Grid里面没有设置DropTarget,就是放置被拖动数据的目标。对grid.container进行如下设置,让表格的容器成为DropTarget:

 1ExtJs----Grid笔记_表格控件_02ExtJs----Grid笔记_表格控件_03var ddrow = new Ext.dd.DropTarget(grid.container,ExtJs----Grid笔记_拖拽_04{
 2ExtJs----Grid笔记_css_24    ddGroup:'GridDD',
 3ExtJs----Grid笔记_css_24    copy:false,
 4ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26    notifyDrop:function(dd,e,data)ExtJs----Grid笔记_拖拽_04{
 5ExtJs----Grid笔记_css_24        //选中了多少行
 6ExtJs----Grid笔记_css_24        var rows = dd.getDragData(e).rowIndex;
 7ExtJs----Grid笔记_css_24        if (typeof(index) == 'undefined')
 8ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        ExtJs----Grid笔记_拖拽_04{
 9ExtJs----Grid笔记_css_24            return
10ExtJs----Grid笔记_右键_61        }

11ExtJs----Grid笔记_css_24
12ExtJs----Grid笔记_css_24        //修改store
13ExtJs----Grid笔记_表格控件_25ExtJs----Grid笔记_右键_26        for(i = 0 ; i < rows.length;i++ExtJs----Grid笔记_拖拽_04{
14ExtJs----Grid笔记_css_24            var rowData = rows[i];
15ExtJs----Grid笔记_css_24            if (!this.copy) store.remove(rowData);
16ExtJs----Grid笔记_css_24            store.insert(index,rowData);
17ExtJs----Grid笔记_右键_61        }

18ExtJs----Grid笔记_右键_61    }

19ExtJs----Grid笔记_拖拽_38}
);

Grid与右键菜单
    
Grid提供了4个与右键菜单有关的事件:
    contextmenu : (Ext.EventObject e): 全局性的右键事件
    cellcontextmenu:(Grid this,Number rowIndex, Number cellIndex,Ext.EventObject e): 单元格的右键事件
    rowcontextmenu:(Grid this,Number rowIndex, Ext.EventObject e): 行上的右键事件
    headercontextmenu:(Grid this,Number colIndex, Ext.EventObject e): 表头的右键事件