EXtjs 合并单元格

来源:互联网 发布:心动网络2018校招 编辑:程序博客网 时间:2024/04/29 19:55
/** 
         * wujian 
         * 合并单元格() 
         * @param {} grid  要合并单元格的grid对象 
         * @param {} main_col  主参考合并列 
         * @param {} ref_cols  副参考合并列:为一个数组(如:[2,4,5])
         */  
        mergeCells : function(grid,main_col,ref_cols){ 
            var arrayTr=document.getElementById(grid.getId()+"-body").firstChild.firstChild.getElementsByTagName('tr'); 
            var trCount = arrayTr.length;  
            var arrayTd;  
            var nullDivText = '<div class="FF0000 border:0px;"></div>';
            var nullBotton = 'border-bottom: #ededed 0px solid;';
            var nullTop = 'border-top:#ededed 0px solid;';
            var nullTopBotton = 'border-top:#ededed 0px solid;border-bottom: #ededed 0px solid;';
            var mergeObjects = [];
            var merge = function(rowspanObj,isMerge){ //定义合并函数 
                if(rowspanObj.rowspan>1){
                if(isMerge) mergeObjects.push(rowspanObj);
                 Ext.each(rowspanObj,function(obj){
                for(var i=0;i<obj.rowspan;i++){
                if((obj.tr+i)<trCount){
                if(i==0){//设置首行
                var firstTd = arrayTr[obj.tr].getElementsByTagName("td");
                            firstTd[obj.td-1].style.cssText=nullBotton;
                            if(obj.rowspan>2)
                            firstTd[obj.td-1].innerHTML = nullDivText;
                }else if(i==(Math.round(obj.rowspan/2-1))){//设置居中
                    var firstTd = arrayTr[obj.tr+i].getElementsByTagName("td");
                            firstTd[obj.td-1].style.cssText=nullTopBotton;
                    }else if(i==(obj.rowspan-1)){//设置最后一行
                     var lastTd = arrayTr[obj.tr+i].getElementsByTagName("td");
                     lastTd[obj.td-1].innerHTML = nullDivText;
                     lastTd[obj.td-1].style.cssText=nullTop;
                    }else{ 
                arrayTd = arrayTr[obj.tr+i].getElementsByTagName("td");
                arrayTd[obj.td-1].innerHTML = nullDivText;
                arrayTd[obj.td-1].style.cssText=nullTopBotton;
                }
                }
                }
                }); 
                }else{
                var firstTd = arrayTr[rowspanObj.tr].getElementsByTagName("td");
               firstTd[rowspanObj.td-1].style.cssText=nullDivText;
                }     
            }; 
            
            var spanRows = function(strTr,cols,trCount,isMerge){
            var rowspanObj = {}; //要进行跨列操作的td对象{tr:1,td:2,rowspan:5}      
            var col;  
            Ext.each(cols,function(colIndex){ //逐列去操作tr  
                var rowspan = 1;  
                var divHtml = null;//单元格内的数值          
                for(var i=strTr;i<trCount;i++){  //i=0表示表头等没用的行  
                    arrayTd = arrayTr[i].getElementsByTagName("td");  
                    for(var j=1;j<arrayTd.length;j++){
                    arrayTd[j].style.css='x-grid-cell';
                    }
                    var cold=0;  
                    col=colIndex+cold;//跳过RowNumber列和check列  
                    if(!divHtml){  
                        divHtml = arrayTd[col-1].innerHTML;  
                        rowspanObj = {tr:i,td:col,rowspan:rowspan};  
                    }else{  
                        var cellText = arrayTd[col-1].innerHTML;  
                        var addf=function(){   
                            rowspanObj["rowspan"] = rowspanObj["rowspan"]+1;  //合并一行
                            if(i==trCount-1){  
                                merge(rowspanObj,isMerge);//执行合并函数 
                            }
                        };  
                        var mergef=function(){  
                            merge(rowspanObj,isMerge);//执行合并函数  
                            divHtml = cellText;  
                            rowspanObj = {tr:i,td:col,rowspan:rowspan};
                        }; 
                        if(cellText == divHtml){addf();}else{mergef();}
                    }  
                }  
            });
            };
            //合并第一列
            spanRows(0,main_col,trCount,true);
            //合并相邻列
            if(ref_cols)
            mergeObjects.forEach(function(rowspanObj){
            spanRows(rowspanObj['tr'],ref_cols,rowspanObj['tr']+rowspanObj['rowspan'],false);
            });
        }
0 0