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
    评论
vxe-table 是一个基于 Vue.js 的表格组件库,它提供了丰富的功能和灵活的配置选项,其中包括拖动功能。 要启用拖动功能,需要在表格组件上添加 `resizable` 属性,并在配置中设置 `resizable: true`。这将允许用户通过拖动边缘来调整宽度。 如果想要实现拖动的排序功能,可以使用 `sortable` 属性,它允许用户通过拖动头来对表格数据进行排序。 以下是一个简单的示例代码: ```vue <template> <vxe-table :data="tableData" resizable > <vxe-table-column type="index" width="60" /> <vxe-table-column field="name" title="Name" resizable sortable /> <vxe-table-column field="age" title="Age" resizable sortable /> <vxe-table-column field="address" title="Address" resizable sortable /> </vxe-table> </template> <script> import 'xe-utils' import VXETable from 'vxe-table' import 'vxe-table/lib/style.css' export default { data() { return { tableData: [ { name: 'John Doe', age: 30, address: '123 Main St' }, { name: 'Jane Smith', age: 25, address: '456 Maple Ave' }, { name: 'Bob Johnson', age: 40, address: '789 Elm St' } ] } }, mounted() { VXETable.init() } } </script> ``` 在上面的示例中,我们设置了表格组件的 `resizable` 属性,以启用拖动功能。然后,在每个配置中,我们设置了 `resizable` 和 `sortable` 属性,以允许用户调整宽度和排序数据。 注意,在使用 vxe-table 时,需要先引入 `xe-utils` 和 `vxe-table` 库,并调用 `VXETable.init()` 方法进行初始化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值