多级次动态合并表格行

转自https://segmentfault.com/q/1010000004408330?_ea=597922

//多级次动态合并表格行
function checkArray(arr1,arr2){
    for (var i = 0; i < arr1.length; i++) {
        if (arr1[i].innerText===arr2[i].innerText) {

         }else{
                  return false;
        }
    }
     return true;
}
function dynamicMergeTableRow(tableId){
      var tb = document.getElementById(tableId);
      var obj1;
      var obj2;
      var objtemp1 = [];
      var objtemp2 = [];
      var rowCount = tb.rows.length;
      var colCount = tb.rows[0].cells.length;
      var colLength = 4;

      //命名(表头除外)
      for (var i = 1; i < rowCount; i++) {
        for (var j = 0; j < colCount; j++) {
          tb.rows[i].cells[j].id = "tb_" + i.toString() + "_" + j.toString();
        }
      }

      //从后往前检查,进行逐列检查合并,开始列为colLength-1
      for (var col = colLength -1; col >= 0; col--) {
         //当col>0时有前方的单元格 
         if (col > 0) {
            //objtemp1为obj1左侧所有单元格集合,初始objtemp1及obj1均从第二行开始(tb_1_)
            for (var l = 0; l < col; l++) {
               objtemp1[l] = document.getElementById("tb_1_" + l.toString());
            }
         }
         obj1 = document.getElementById("tb_1_" + col.toString());

         //obj2为obj1下方单元格,obj1从第二行开始,则obj2从第三行开始,遍历以row=2为起始值
         for (var row = 2; row < rowCount; row++) {
                //同obj1及objtemp1,col>0:即有前方单元格,此时有objtemp2
                if (col > 0) {
                    for (var l = 0; l < col; l++) {
                       objtemp2[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString());
                    }
                }
                obj2 = document.getElementById("tb_" + row.toString() +"_"+ col.toString());

                //定义完obj1/obj2/objtemp1/objtemp2后,开始合并
                //第一层判断:当obj1的值等于obj2时,即同一列的相邻单元格值相同
                if (obj1.innerText == obj2.innerText) {
                    //第二层判断:obj1/obj2所在列前方还有其他列:即col>0(此步判断为单元格合并的依赖性提供支持)
                    if (col > 0) {
                        //第三层判断:obj1/obj2所在列前方还有其他列,且objtemp1,objtemp2值完全相同,可以合并
                        if (checkArray(objtemp1,objtemp2)) {
                            obj1.rowSpan++;
                            obj2.parentNode.removeChild(obj2);
                        }
                        //第三层判断:obj1/obj2所在列前方还有其他列,且objtemp1,objtemp2值不同,不可合并,并重新对obj1/objtemp1赋值,令其等于原来的obj2/objtemp2          
                        else{
                            obj1 = document.getElementById("tb_" + row.toString() +"_"+ col.toString());
                            for (var l = 0; l < col; l++) {
                                objtemp1[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString());
                            }                  
                        }
                    }
                    //第二层判断:obj1/obj2所在列为首列,直接合并
                    else{
                        obj1.rowSpan++;
                        obj2.parentNode.removeChild(obj2);
                    }
                }
                //第一层判断:当obj1的值不等于obj2时,即同一列的相邻单元格值不相,此时重新对obj1/objtemp1赋值,令其等于原来的obj2/objtemp2
                else{
                    obj1 = document.getElementById("tb_" + row.toString() +"_"+ col.toString());
                    for (var l = 0; l < col; l++) {
                        objtemp1[l] = document.getElementById("tb_" + row.toString() +"_"+ l.toString());
                    }       
                }
         }
         objtemp1 = [];
         objtemp2 = [];
      }
}

效果图:
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果需要在 Qt 中实现多级合并的表头,可以使用 QHeaderView 的 setSpan() 方法来设置单元格跨度。这个方法接受四个参数,分别是起始列、起始、跨度列数和跨度数。因此,我们可以通过调用这个方法来实现单元格的合并。 下面是一个简单的示例代码,演示如何使用 QHeaderView 实现多级合并的表头: ```cpp QStandardItemModel *model = new QStandardItemModel(); // 设置列数和数 model->setColumnCount(3); model->setRowCount(2); // 设置第一层表头 model->setHeaderData(0, Qt::Horizontal, "A"); model->setHeaderData(1, Qt::Horizontal, "B"); model->setHeaderData(2, Qt::Horizontal, "C"); // 设置第二层表头 model->setHeaderData(0, Qt::Vertical, "1"); model->setHeaderData(1, Qt::Vertical, "2"); // 合并单元格 QHeaderView *headerView = new QHeaderView(Qt::Horizontal, tableView); headerView->setSectionsClickable(true); headerView->setSectionResizeMode(QHeaderView::Stretch); headerView->setSpan(0, 0, 2, 1); // 合并第一列的两 headerView->setSpan(0, 1, 1, 2); // 合并第二列和第三列的一个单元格 tableView->setHorizontalHeader(headerView); QTableView *tableView = new QTableView(); tableView->setModel(model); // 显示表格 tableView->show(); ``` 在这个示例中,我们首先创建了一个 QStandardItemModel 对象,并设置了两层表头。第一层表头包含了三个列,显示为 "A"、"B" 和 "C"。第二层表头包含了两,分别显示为 "1" 和 "2"。 然后,我们创建了一个 QHeaderView 控件,并将它设置为水平表头。接着,我们调用 setSpan() 方法来合并单元格。我们合并了第一列的两,以及第二列和第三列的一个单元格。 最后,我们将这个表头控件设置给 QTableView 控件,然后显示表格。 这样,我们就实现了一个带有多级合并的表头。如果需要更复杂的表头结构,可以继续使用 QHeaderView 的 setSpan() 方法来实现更高级别的合并

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值