<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    最愛Java

    書山有路勤為徑,學海無涯苦作舟

    ExtJs----Grid筆記

    制作一個簡單的Grid

     1var cm = new Ext.grid.ColumnModel([
     2    {header:'編號',dataIndex:'id'},
     3    {header:'名稱',dataIndex:'name'},
     4    {header:'描述',dataIndex:'desc'}
     5]);
     6
     7var data = [
     8    [1,'name1','desc1'],
     9    [2,'name2','desc2'],
    10    [3,'name3','desc3'],
    11    [4,'name4','desc4'],
    12    [5,'name5','desc5']
    13];
    14
    15var store = new Ext.data.Store({
    16    proxy:new Ext.data.MemoryProxy(data),
    17    reader:new Ext.data.ArrayReader({},[
    18        {name:'id'},
    19        {name:'name'},
    20        {name:'desc'}
    21    ])
    22}
    );
    23
    24store.load();
    25
    26var grid = new Ext.grid.GridPanel({
    27    height:600,
    28    renderTo:'grid',
    29    store:store,
    30    cm:cm
    31}
    );

    Grid常用功能詳解
        
    enableColumnMove : true/false  //是否可拖放列
        enableColumnResize : true/false  //是否可以改變列的寬度
        stripeRows : true/false  //斑馬線效果
        如果需要每列自動填滿Grid,可以使用viewConfig配置中的foreceFit。即:

    1var grid = new Ext.grid.GridPanel({
    2    height:600,
    3    renderTo:'grid',
    4    store:store,
    5    cm:cm,
    6    viewConfig:{
    7        forceFit:true
    8    }

    9}
    );

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

     1Ext.data.Store.prototype.applySort = function() {
     2    if (this.sortInfo && !this.remoteSort) {
     3        var s = this.sortInfo, f = s.field;
     4        var st = this.fields.get(f).sortType;
     5        var fn = function(r1,r2){
     6            var v1 = st(r1.data[f]), v2=st(r2.data[f]);
     7            if (typeof(v1) == "string"){
     8                return v1.localeCompare(v2);
     9            }

    10            return v1 > v2 ? 1: (v1 < v2 ? -1 : 0)
    11        }
    ;
    12        this.data.sort(s.direction,fn);
    13        if (this.snapshot && this.snapshot != this.data) {
    14            this.snapshot.sort(s.direction, fn);
    15        }

    16    }

    17}
    ;

    在單元格中顯示紅色的字、圖片和按鈕

     1var cm = new Ext.grid.ColumnModel([
     2    {header:'編號',dataIndex:'id'},
     3    {header:'名稱',dataIndex:'name'},
     4    {header:'性別',dataIndex:'sex',renderer:function(value){
     5        if (value == 'male') {
     6            return "<span style='color:red;font-weight:bold;'>紅男</span><img src='user_male.png'/>"
     7        }
     else {
     8            return "<span style='color:green;font-weight:bold;'>綠女</span><img src='user_female.png'/>"
     9        }

    10    }
    }
    ,
    11    {header:'描述',dataIndex:'desc',renderer:fn}
    12]);
    13
    14var fn = function(value, cellmeta, record, rowIndex, columnIndex, store){
    15    var str = "<input type='button' value='查看詳細信息' onclick='alert(\""+
    16        "這個單元格的值是: " + value + "\\n" +
    17        "這個單元格的配置是: {cellId" + cellmeta.cellId + ",Id:" + cellmeta.id + ",css:" + cellmeta.css + "}\\n" +
    18        "這個單元格對應行的record是:" + record + ", 一行的數據都在里面\\n" + 
    19        "這是第" + rowIndex + "行\\n" +
    20        "這是第" + columnIndex + "列\\n" +
    21        "這個表格對應的Ext.data.Store在這里:" + store + ", 隨便用吧。" +
    22        "\")'>";
    23    return str;
    24}

    給Grid的行和列設置顏色
    //設置行的顏色
    viewConfig:{
        forceFit:
    true,
        enableRowBody:
    true,
        getRowClass:
    function(record,rowIndex,p,ds){
            
    var cls = 'white-row';
            
    if (record.data.id % 2 == 0)
            
    {
                cls 
    = 'red-row'
            }
     else {
                cls 
    = 'yellow-row'
            }

            
    return cls;
        }

    }

    1//修改列的顏色,使用renderer屬性配置如下方法
    2var fn = function(value, cellmeta, record, rowIndex, columnIndex, store){
    3    var value = record.get('color');
    4    cell.attr = "style=background-color:" + value;
    5    return data;
    6}

        當然,如果只想修改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參數。

    1var grid = new Ext.grid.GridPanel ({
    2    renderTo : 'grid',
    3    store : store,
    4    cm : cm,
    5    sm : new Ext.grid.RowSelectionModel({singleSelect:true})
    6)}
    ;

    表格視圖---Ext.grid.GridView
       
    Ext的表格控件都遵循MVC模型,Ext.data.Store可看做Model模型,Ext.grid.GridPanel中設置各種監聽器可看做Controller控制器,而Ext.grid.GridView對應的就是View視圖。通常情況下,不需要自行創建Ext.grid.GridView的實例,GridPanel會自行生成對應的實例,并可通過getView()函數來獲取當前表格使用的視圖實例。

    1Ext.get('scroll').on('click',function(){
    2    grid.getView().scrollToTop();
    3}
    )

        當然,我們也可以為GridView設置初始參數:

    1viewConfig:{
    2    columnsText:'顯示的列',
    3    scrollOffset:30,  //表格右側滾動條的寬度,默認是20px
    4    sortAscText:'升序',
    5    sortDescText:'降序',
    6    forceFit:true
    7}

    后臺排序
        
    Grid的后臺排序只需在配置Ext.data.Store的時候配置remoteSort:true即可,這樣下次排序的時候,Store會向后臺提交兩個參數:sort和dir。sort表示需要排序的字段,dir表示升序或降序(ASC/DESC)。

    屬性表格控件----PropertyGrid

     1var gird = new Ext.grid.PropertyGrid({
     2    title:'屬性表格',
     3    autoHeight:true,
     4    width:300,
     5    renderTo:'grid1',
     6    source:{
     7        "名字":"不告訴你",
     8        "創建時間":new Date(Date.parse('12/15/2007')),
     9        "是否有效":false,
    10        "版本號":.01,
    11        "描述":"恩,估計沒有啥可說的"
    12    }

    13}
    );

            上述代碼就很容易地構建出一個可編輯的Grid,且各個字段的編輯器都是對應的。如果需要只能看不能動的PropertyGrid,則:

    1grid.on("beforeedit",function(e){
    2    e.cancel = true;
    3    return false;
    4}
    );

        如果需要強制對name列排序,則需要修改Ext.grid.PropertyGrid.prototype.initComponent源碼,將store.store.sort('name','ASC')注釋掉即可。
        下面示例了自定義編輯器的代碼:

     1var grid = new Ext.grid.PropertyGrid({
     2    title:'表格屬性',
     3    autoHeight:true,
     4    width:300,
     5    renderTo:'grid',
     6    customEditors:{
     7        'Start Time':new Ext.grid.GridEditor(new Ext.form.TimeField({selectOnFocus:true}))
     8    }
    ,
     9    soruce:{
    10        'Start Time':'10:00 AM'
    11    }

    12}
    );

    分組表格控件----Group

     1var reader = new Ext.data.ArrayReader({},[
     2    {name:'id'},
     3    {name:'sex'},
     4    {name:'name'},
     5    {name:'desc'}
     6]);
     7
     8var data = [
     9    [1,'male','name1','descn1'],
    10    [2,'female','name2','descn2'],
    11    [3,'male','name3','descn3'],
    12    [4,'female','name4','descn4'],
    13    [5,'male','name5','descn5']
    14];
    15
    16var store = new Ext.data.GroupingStore({
    17    reader:reader,
    18    data:data,
    19    groupField:'sex',
    20    sortInfo:{field:'id',direction:"ASC"}
    21}
    );
    22
    23var grid = new Ext.grid.GridPanel({
    24    store:store,
    25    height:300,
    26    columns:[
    27        {header:'編號',dataIndex:'id'},
    28        {header:'性別',dataIndex:'sex'},
    29        {header:'名稱',dataIndex:'name'},
    30        {header:'描述',dataIndex:'desc'}
    31    ],
    32    view:new Ext.grid.GroupingView(),
    33    renderTo:'grid'
    34}
    );
        
        上述示例需要關注的是groupField,確定通過哪一項分組。令人困惑的是,GroupingStore要求必須設置sortInfo。同樣,也可以通過grid.getView()來獲取到Ext.grid.GroupingView的實例。

    可拖放的表格
        
    1var rz = new Ext.Resizable('grid',{
    2    wrap:true,
    3    minHeight:100,
    4    pinned:true,
    5    handles:'s'
    6}
    );
    7
    8rz.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:

     1var ddrow = new Ext.dd.DropTarget(grid.container,{
     2    ddGroup:'GridDD',
     3    copy:false,
     4    notifyDrop:function(dd,e,data){
     5        //選中了多少行
     6        var rows = dd.getDragData(e).rowIndex;
     7        if (typeof(index) == 'undefined')
     8        {
     9            return
    10        }

    11
    12        //修改store
    13        for(i = 0 ; i < rows.length;i++{
    14            var rowData = rows[i];
    15            if (!this.copy) store.remove(rowData);
    16            store.insert(index,rowData);
    17        }

    18    }

    19}
    );

    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): 表頭的右鍵事件

    posted on 2009-10-21 15:05 Brian 閱讀(4776) 評論(2)  編輯  收藏 所屬分類: EXTJS

    評論

    # re: ExtJs----Grid筆記 2012-07-09 17:07 zxl

    hh  回復  更多評論   

    # re: ExtJs----Grid筆記 2012-07-09 17:08 zxl

    非常感謝你的資料,使我明白了!  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    公告


    導航

    <2009年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲日韩精品A∨片无码加勒比 | 日韩亚洲国产二区| 99视频在线看观免费| 四虎影视久久久免费观看| 亚洲永久在线观看| 亚洲第一视频网站| 亚洲精品乱码久久久久久自慰| 成人免费视频小说| 永久免费毛片在线播放| 日韩精品无码免费一区二区三区 | 最新免费jlzzjlzz在线播放| 一个人免费视频观看在线www| 免费在线观看一区| 美女被羞羞网站免费下载| 国产午夜亚洲精品国产| 亚洲国产日韩在线一区| 777亚洲精品乱码久久久久久 | 亚洲av永久无码天堂网| 亚洲精品国产情侣av在线| 亚洲国产精品无码成人片久久| 免费在线观看黄网站| 国产成人综合久久精品免费| 毛片在线看免费版| 成人网站免费观看| AV片在线观看免费| 免费无码看av的网站| 在线不卡免费视频| 成年女人喷潮毛片免费播放| 最近中文字幕无吗免费高清| 成人毛片免费观看视频| 日韩电影免费在线| 四虎影在线永久免费观看| 国产成人免费A在线视频| 在线免费观看国产视频| 日本特黄特色免费大片| 国产一区在线观看免费| 亚洲精品NV久久久久久久久久| 亚洲国产电影av在线网址| 久久久久亚洲精品中文字幕 | 玖玖在线免费视频| 免费不卡在线观看AV|