当前位置: 代码网 > it编程>前端脚本>ExtJs > ExtJS 4.2 Grid组件单元格合并的方法

ExtJS 4.2 Grid组件单元格合并的方法

2024年05月15日 ExtJs 我要评论
extjs 4.2 grid组件本身并没有提供单元格合并功能,需要自己实现这个功能。目录1. 原理2. 多列合并3. 代码与在线演示1. 原理1.1 html代码分析首先创建一个grid组件,然后查看

extjs 4.2 grid组件本身并没有提供单元格合并功能,需要自己实现这个功能。

目录

1. 原理

2. 多列合并

3. 代码与在线演示

1. 原理

1.1 html代码分析

首先创建一个grid组件,然后查看下的html源码。

1.1.1 grid组件

1.1.2 html代码

从这些代码中可以看出,grid组件可分为grid-header和grid-body 两块区域(若含有工具栏和分页栏,它们都会含有各自的独立区域)。

其中grid-body包含了许多tr元素,每一个tr都是代表grid组件中的一行数据;每个tr内部都包含了许多td,每个td表示一个单元格。

1.1.3 结构图

1.2 原理

1.2.1 步骤说明

具体的操作是针对tr元素,步骤如下:

1) 比较第一行tr与第二行tr的某个td的值,若两行的值相等:设置第一行tr的td的rowspan属性的值+1;设置第二行tr的td隐藏。

2) 比较第一行tr与第三行tr的某个td的值,若两行的值相等:设置第一行tr的td的rowspan属性的值+1;设置第三行tr的td隐藏。

3) 重复上面的步骤,若两行的值不相等,就跳过本次比较,进行下一次比较:当前行与下一行进行比较。

1.2.2 示例

1) tr1与tr2比较,两者值相等:设置tr1的rowspan属性的值+1;设置第tr2的td隐藏。

2)tr1与tr3比较,两者值相等:设置tr1的rowspan属性的值+1;设置第tr3的td隐藏。

3) tr1与tr4比较,两者的td不相等。跳过本次比较,进行下一次比较:tr4与tr5比较(当前行与下一行进行比较)。

2.多列合并

gird的合并可分为单列合并和多列合并,其中多列合并可分为两种:

第一种:逐个列合并。

第二种:相同列合并。

2.1 逐个列合并

说明:每个列在前面列合并的前提下可分别合并。

示例:

2.2 全部列合并

说明:只有相邻tr所指定的td都相同才会进行合并。

示例:

3. 代码与在线演示

3.1 代码

 /**
* 合并grid的数据列
* @param grid {ext.grid.panel} 需要合并的grid
* @param colindexarray {array} 需要合并列的index(序号)数组;从0开始计数,序号也包含。
* @param isallsome {boolean} 是否2个tr的colindexarray必须完成一样才能进行合并。true:完成一样;false:不完全一样
*/
function mergegrid(grid, colindexarray, isallsome) {
 isallsome = isallsome == undefined ? true : isallsome; // 默认为true
 
 // 1.是否含有数据
 var gridview = document.getelementbyid(grid.getview().getid() + '-body');
 if (gridview == null) {
 return;
 }
 
 // 2.获取grid的所有tr
 var trarray = [];
 if (grid.layout.type == 'table') { // 若是table部署方式,获取的tr方式如下
 trarray = gridview.childnodes;
 } else {
 trarray = gridview.getelementsbytagname('tr');
 }
 
 // 3.进行合并操作
 if (isallsome) { // 3.1 全部列合并:只有相邻tr所指定的td都相同才会进行合并
 var lasttr = trarray[0]; // 指向第一行
 // 1)遍历grid的tr,从第二个数据行开始
 for (var i = 1, trlength = trarray.length; i < trlength; i++) {
  var thistr = trarray[i];
  var ispass = true; // 是否验证通过
  // 2)遍历需要合并的列
  for (var j = 0, colarraylength = colindexarray.length; j < colarraylength; j++) {
  var colindex = colindexarray[j];
  // 3)比较2个td的列是否匹配,若不匹配,就把last指向当前列
  if (lasttr.childnodes[colindex].innertext != thistr.childnodes[colindex].innertext) {
   lasttr = thistr;
   ispass = false;
   break;
  }
  }
 
  // 4)若colindexarray验证通过,就把当前行合并到'合并行'
  if (ispass) {
  for (var j = 0, colarraylength = colindexarray.length; j < colarraylength; j++) {
   var colindex = colindexarray[j];
   // 5)设置合并行的td rowspan属性
   if (lasttr.childnodes[colindex].hasattribute('rowspan')) {
   var rowspan = lasttr.childnodes[colindex].getattribute('rowspan') - 0;
   rowspan++;
   lasttr.childnodes[colindex].setattribute('rowspan', rowspan);
   } else {
   lasttr.childnodes[colindex].setattribute('rowspan', '2');
   }
   // lasttr.childnodes[colindex].style['text-align'] = 'center';; // 水平居中
   lasttr.childnodes[colindex].style['vertical-align'] = 'middle';; // 纵向居中
   thistr.childnodes[colindex].style.display = 'none';
  }
  }
 }
 } else { // 3.2 逐个列合并:每个列在前面列合并的前提下可分别合并
 // 1)遍历列的序号数组
 for (var i = 0, colarraylength = colindexarray.length; i < colarraylength; i++) {
  var colindex = colindexarray[i];
  var lasttr = trarray[0]; // 合并tr,默认为第一行数据
  // 2)遍历grid的tr,从第二个数据行开始
  for (var j = 1, trlength = trarray.length; j < trlength; j++) {
  var thistr = trarray[j];
  // 3)2个tr的td内容一样
  if (lasttr.childnodes[colindex].innertext == thistr.childnodes[colindex].innertext) {
   // 4)若前面的td未合并,后面的td都不进行合并操作
   if (i > 0 && thistr.childnodes[colindexarray[i - 1]].style.display != 'none') {
   lasttr = thistr;
   continue;
   } else {
   // 5)符合条件合并td
   if (lasttr.childnodes[colindex].hasattribute('rowspan')) {
    var rowspan = lasttr.childnodes[colindex].getattribute('rowspan') - 0;
    rowspan++;
    lasttr.childnodes[colindex].setattribute('rowspan', rowspan);
   } else {
    lasttr.childnodes[colindex].setattribute('rowspan', '2');
   }
   // lasttr.childnodes[colindex].style['text-align'] = 'center';; // 水平居中
   lasttr.childnodes[colindex].style['vertical-align'] = 'middle';; // 纵向居中
   thistr.childnodes[colindex].style.display = 'none'; // 当前行隐藏
   }
  } else {
   // 5)2个tr的td内容不一样
   lasttr = thistr;
  }
  }
 }
 }
} 

3.2 在线演示

在线演示:http://www.akmsg.com/extjs/index.html#app.demo.mergegridtab

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com