grid+table列合并(体现一对多关系)

结果如下图:



table列合并,前4列合并。JS代码如下:

/**
*tbl:table对应的dom元素
*beginRow:从第几行开始合并(从0开始)
*endRow:合并到哪一行,负数表示从底下数几行不合并 (为0时,则到table最后一行)
*colIdxes:合并的列下标的数组,如[0,1]表示合并前两列,[0]表示只合并第一列
* by whb 20180427
**/

function _mergeSameCell(tbl,beginRow,endRow,colIdxes){
    debugger;
    var colIdx = colIdxes[0];
    var newColIdxes = colIdxes.concat();
    newColIdxes.splice(0,1);
    var delRows = new Array();
    //var rs = tbl.rows;
   var rs =  tbl.find("tbody tr");
    //endRow为0的时候合并到最后一行,小于0时表示最后有-endRow行不合并  
    if(endRow === 0){
        endRow = rs.length - 1;
    }else if(endRow < 0){
        endRow = rs.length - 1 + endRow;
    }
    var rowSpan = 1; //要设置的rowSpan的值  
    var rowIdx = beginRow; //要设置rowSpan的cell行下标  
    var cellValue; //存储单元格里面的内容  
    for(var i=beginRow; i<= endRow + 1; i++){  
        if(i === endRow + 1){//过了最后一行的时候合并前面的单元格 
            if(newColIdxes.length > 0){  
                _mergeSameCell(tbl,rowIdx,endRow,newColIdxes);  
            }  
            rs[rowIdx].cells[colIdx].rowSpan = rowSpan;  
        }else{  
            var cell = rs[i].cells[colIdx];  
            if(i === beginRow){//第一行的时候初始化各个参数  
                cellValue = cell.innerHTML;
                rowSpan = 1;
                rowIdx = i;
            }else if(cellValue != cell.innerHTML){//数据改变合并前面的单元格  
                cellValue = cell.innerHTML;
                if(newColIdxes.length > 0){
                    me.mergeSameCell(tbl,rowIdx,i - 1,newColIdxes);
                }
                rs[rowIdx].cells[colIdx].rowSpan = rowSpan;
                rowSpan = 1;
                rowIdx = i;
            }else if(cellValue === cell.innerHTML){//数据和前面的数据重复的时候删除单元格
                rowSpan++;
                delRows.push(i);
            }
        }
    }
    for(var j=0;j<delRows.length; j++){
        //rs[delRows[j]].deleteCell(colIdx); //删除
        debugger;
        rs[delRows[j]].cells[colIdx].style.display = 'none';//隐藏字段,不删除
    }
}

 

使用如下:

_mergeSameCell($("#grid").find("table").first(),0,0,[1,2,3,4]);

 上面的代码会出现以下情况:


解决方法:

用第一列确定其他列是否合并,不再用每一列确定每一列的合并情况:

/**
*tbl:table对应的dom元素
*beginRow:从第几行开始合并(从0开始)
*endRow:合并到哪一行,负数表示从底下数几行不合并 
*colIdxes:合并的列下标的数组,如[0,1]表示合并前两列,[0]表示只合并第一列
* by whb 20180427
**/

me.mergeSameCell = function (tbl,beginRow,endRow,colIdxes){
    debugger;
    var colIdx = colIdxes[0];
    var newColIdxes = colIdxes.concat();
    newColIdxes.splice(0,1);
    var delRows = new Array();
    //var rs = tbl.rows;
    var rs =  tbl.find("tbody tr");
    //endRow为0的时候合并到最后一行,小于0时表示最后有-endRow行不合并  
    if(endRow === 0){
        endRow = rs.length - 1;
    }else if(endRow < 0){
        endRow = rs.length - 1 + endRow;
    }
    var rowSpan = 1; //要设置的rowSpan的值  
    var rowIdx = beginRow; //要设置rowSpan的cell行下标  
    var cellValue; //存储单元格里面的内容  
    var cellValue2; //存储单元格里面的内容  
    for(var i=beginRow; i<= endRow + 1; i++){  
        if(i === endRow + 1){//过了最后一行的时候合并前面的单元格 
            if(newColIdxes.length > 0){  
                me.mergeSameCell(tbl,rowIdx,endRow,newColIdxes);  
            }  
            rs[rowIdx].cells[colIdx].rowSpan = rowSpan;  
        }else{  
            debugger;
            var cell = rs[i].cells[colIdx];  

            if(i == beginRow){//第一行的时候初始化各个参数  
                cellValue = cell.innerHTML;
                rowSpan = 1;
                rowIdx = i;
            }else if(cellValue != cell.innerHTML){//数据改变合并前面的单元格  
                cellValue = cell.innerHTML;
                //                 if(newColIdxes.length > 0){//每一列确定各自是否合并
                //                     me.mergeSameCell(tbl,rowIdx,i - 1,newColIdxes);
                //                 }
                rs[rowIdx].cells[colIdx].rowSpan = rowSpan;
                for(var k=1;k<colIdxes.length;k++){//仅用第一列确定其他列是否合并,第一列合并则其他列也合并。
                    rs[rowIdx].cells[colIdxes[k]].rowSpan = rowSpan;
                }

                rowSpan = 1;
                rowIdx = i;
            }else if(cellValue == cell.innerHTML){//数据和前面的数据重复的时候删除单元格
                rowSpan++;
                delRows.push(i);
            }
        }
    }
    for(var j=0;j<delRows.length; j++){
        //rs[delRows[j]].deleteCell(colIdx); //删除
        debugger;
        rs[delRows[j]].cells[colIdx].style.display = 'none';//隐藏字段,不删除
        for(var k=1;k<colIdxes.length;k++){
            rs[delRows[j]].cells[colIdxes[k]].style.display = 'none';//隐藏字段,不删除
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值