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


Posted in Javascript onOctober 12, 2016

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

目录

1. 原理

2. 多列合并

3. 代码与在线演示

1. 原理

1.1 HTML代码分析

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

1.1.1 Grid组件

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

1.1.2 HTML代码

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

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

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

1.1.3 结构图

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

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隐藏。

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

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

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

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

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

2.多列合并

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

第一种:逐个列合并。

第二种:相同列合并。

2.1 逐个列合并

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

示例:

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

2.2 全部列合并

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

示例:

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
Jun 14 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
教你5分钟学会用requirejs(必看篇)
Jul 25 Javascript
vue-router实现组件间的跳转(参数传递)
Nov 07 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
详解在网页上通过JS实现文本的语音朗读
Mar 28 Javascript
浅谈vue.use()方法从源码到使用
May 12 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
Sep 12 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 Javascript
浅谈Vue 自动化部署打包上线
Jun 14 Javascript
详解webpack的文件监听实现(热更新)
Sep 11 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 #Javascript
如何使用jquery实现文字上下滚动效果
Oct 12 #Javascript
微信js-sdk界面操作接口用法示例
Oct 12 #Javascript
微信小程序 location API接口详解及实例代码
Oct 12 #Javascript
webpack+vue.js实现组件化详解
Oct 12 #Javascript
微信小程序 加载 app-service.js 错误解决方法
Oct 12 #Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 #Javascript
You might like
php实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
php通用防注入程序 推荐
2011/02/26 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
python控制台显示时钟的示例
2014/02/24 Python
python类继承用法实例分析
2015/05/27 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
python issubclass 和 isinstance函数
2019/07/25 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python 自由定制表格的实现示例
2020/03/20 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
土建资料员岗位职责
2014/01/04 职场文书
给公司的建议书范文
2014/05/13 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
教师节活动总结
2014/08/29 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
清洁工个人工作总结
2015/03/05 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server