Extjs 實現多行合並(rowspan)效果


引用
聲明:
  本效果的本質,只是用css去除邊框而已,不包含分組功能。
  代碼在IE6-8, FF3下測試通過
  代碼依賴於Extjs 3.x



1.加入css樣式

Java代碼   收藏代碼
  1. /*rowspan grid合並行效果*/  
  2. .rowspan-grid .x-grid3-body .x-grid3-row {  
  3.     border:none;  
  4.     cursor:default;  
  5.     width:100%;  
  6. }  
  7. .rowspan-grid .x-grid3-header .x-grid3-cell{  
  8.     /*border-left: 2px solid transparent;*//*ie6的transparent下顯示黑色?*/  
  9.     border-left: 2px solid #fff;  
  10. }  
  11. .rowspan-grid .x-grid3-body .x-grid3-row{  
  12.     overflow: hidden;  
  13.     border-right: 1px solid #ccc;  
  14. }  
  15. .rowspan-grid .x-grid3-body .x-grid3-cell {  
  16.     border: 1px solid #ccc;  
  17.     border-top:none;  
  18.     border-right:none;  
  19. }  
  20. .rowspan-grid .x-grid3-body .x-grid3-cell-first {  
  21.     /*border-left: 1px solid transparent;*/  
  22.     border-left: 1px solid #fff;  
  23. }  
  24. .rowspan-grid .x-grid3-body .rowspan-unborder {  
  25.     /*border-bottom:1px solid transparent;*/  
  26.     border-bottom:1px solid #fff;  
  27. }  
  28. .rowspan-grid .x-grid3-body .rowspan {  
  29.     border-bottom: 1px solid #ccc;  
  30. }  



2.引入Ext.ux.grid.RowspanView對象

Java代碼   收藏代碼
  1. Ext.ns('Ext.ux.grid');  
  2. /** 
  3.  * 實現grid的rowspan效果 
  4.  *  @author: tipx.iteye.com 
  5.  * 
  6.  *  1.在列模型里需要配置合並行的列中設置rowspan屬性,如:{dataIndex:'xxx', header:'xxx', rowspan:3} //該列每三行合並一行 
  7.  *  2.為grid設置view屬性 => view : new Ext.ux.grid.RowspanView() 
  8.  *  3.為grid設置cls屬性 => cls : 'rowspan-grid' 
  9.  *  4.加入css樣式 
  10.  */  
  11. Ext.ux.grid.RowspanView = Ext.extend(Ext.grid.GridView, {  
  12.     constructor: function(conf) {  
  13.         Ext.ux.grid.RowspanView.superclass.constructor.call(this, conf);  
  14.     },  
  15.     // private  
  16.     //清除合並的行中,非第一行的數據  
  17.     cleanRenderer : function(column, value, metaData, record, rowIndex, colIndex, store) {  
  18.         var rowspan = column.rowspan;  
  19.         if(!Ext.isEmpty(rowspan) && rowspan !== 0){  
  20.             if(rowIndex % rowspan !== 0){  
  21.                 return '';  
  22.             }  
  23.         }  
  24.         return column.renderer(value, metaData, record, rowIndex, colIndex, store);  
  25.     },  
  26.     // private  
  27.     doRender : function(cs, rs, ds, startRow, colCount, stripe){  
  28.         var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;  
  29.         var tstyle = 'width:'+this.getTotalWidth()+';';  
  30.         // buffers  
  31.         var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;  
  32.   
  33.         //cmConfig列模型  
  34.         var cmConfig = this.cm.config, rowspans=[];  
  35.         for(var i = 0, len = cmConfig.length; i < len; i++){  
  36.             rowspans.push(Math.max((cmConfig[i].rowspan || 0), 0));  
  37.         }  
  38.   
  39.         for(var j = 0, len = rs.length; j < len; j++){  
  40.             r = rs[j]; cb = [];  
  41.             var rowIndex = (j+startRow);  
  42.             for(var i = 0; i < colCount; i++){  
  43.                 c = cs[i];  
  44.                 p.id = c.id;  
  45.                 p.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');  
  46.                 p.attr = p.cellAttr = "";  
  47.                 p.value = this.cleanRenderer(cmConfig[i], r.data[c.name], p, r, rowIndex, i, ds);  
  48.                 p.style = c.style;  
  49.                 if(Ext.isEmpty(p.value)){  
  50.                     p.value = "&#160;";  
  51.                 }  
  52.                 if(this.markDirty && r.dirty && typeof r.modified[c.name] !== 'undefined'){  
  53.                     p.css += ' x-grid3-dirty-cell';  
  54.                 }  
  55.                 //------------------------------------------------  
  56.                 //添加rowspan類,用樣式實現合並行的效果  
  57.                 if(rowspans[i] !== 0){  
  58.                     //每rowspan行以及最后一行加上rowspan類,即加上border-bottom  
  59.                     if(j == (len-1) || (rowIndex+1) % rowspans[i] === 0){  
  60.                         p.css += ' rowspan';  
  61.                     }else{  
  62.                         p.css += ' rowspan-unborder';  
  63.                     }  
  64.                 }  
  65.                 //------------------------------------------------  
  66.                 cb[cb.length] = ct.apply(p);  
  67.             }  
  68.             var alt = [];  
  69.             if(stripe && ((rowIndex+1) % 2 === 0)){  
  70.                 alt[0] = "x-grid3-row-alt";  
  71.             }  
  72.             if(r.dirty){  
  73.                 alt[1] = " x-grid3-dirty-row";  
  74.             }  
  75.             rp.cols = colCount;  
  76.             if(this.getRowClass){  
  77.                 alt[2] = this.getRowClass(r, rowIndex, rp, ds);  
  78.             }  
  79.             rp.alt = alt.join(" ");  
  80.             rp.cells = cb.join("");  
  81.             buf[buf.length] =  rt.apply(rp);  
  82.         }  
  83.         return buf.join("");  
  84.     }  
  85. });  



3.創建grid
a. 創建列模型時,在需要合並行的列模型中加入配置:“rowspan:行數”(不含雙引號)

Java代碼   收藏代碼
  1. {header: 'Company', dataIndex: 'company', rowspan:4}//本列每4行合並為1行  


b. 創建grid時,為grid配置:“cls:'rowspan-grid',view: new Ext.ux.grid.RowspanView()”

Java代碼   收藏代碼
  1. // create the Grid  
  2.   var grid = new Ext.grid.GridPanel({  
  3.       title: 'Extjs實現行合並(rowspan)效果',  
  4.       store: store,  
  5.       sm:sm,  
  6.       cm:cm,  
  7.       stripeRows: true,  
  8.       cls: 'rowspan-grid'//******必須配置此樣式  
  9.       view: new Ext.ux.grid.RowspanView() //****使用view  
  10.   });  



4.預覽效果



5.瑕疵
  由於ie6以外的瀏覽器的盒模型比較怪異(主因還是我自身不擅處理CSS),列頭與數據列的邊框有些對不齊(當前的效果已經是盡了最大努力了);

  由於“border-left: 2px solid transparent”中的transparent在ie6下顯示黑色,本人對hack又不擅長(=。=都不知道自己到底擅長什么了),所以就干脆將 transparent全部用白色替換了(效果會差一些),如果能直接對ie6進行hack的話,應該會完美一點

6.注意
  從效果圖上可以看出,合並行的區域,只顯示合並行中的第一行數據,但這並不是分組效果!而是通過view中的cleanRenderer方法將“第x個rowspan區域的非第一行數據”直接返回空串而已。並不是將相同的數據合並!

7.demo下載
見附件 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM