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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索grid
, extjs4.2
Grid组件
extjs4.2 grid、extjs4.2 grid行编辑、extjs4.2 grid分组、extjs4.2 grid 分页、extjs4.2 treegrid,以便于您获取更多的相关知识。

时间: 2024-10-22 22:58:44

ExtJS 4.2 Grid组件单元格合并的方法_extjs的相关文章

关于Extjs中FieldSet中的单元格合并的问题

问题描述 如上图所示.我现在的做法如下:var fieldSet2 = new Ext.form.FieldSet({        title:'基本信息',        //width:400,        height:260,        columnWidth: 1,        layout: 'column',        border: true,        anchor:'100%',        labelWidth: 60,        buttonAli

扩展方法(2) GridView单元格合并

大家GridView都用的比较多吧..有没遇到单元格需要合并的需求.. 单元格合并原理其实很简单,就是逐行判断要合并的单元格里的值是否和上一行的相同,要是相同的 话就合并,不同的话就接着判断 我们可以通过扩展方法为GridView添加单元合并 public static class GridViewExtensions { /// <summary> /// GridView行合并 /// </summary> /// <param name="gridView&q

table标签的结构与合并单元格的实现方法

以下是对table标签的结构与合并单元格的实现方法进行了详细的分析介绍,需要的朋友可以过来参考下   1.<table>标签的结构示例代码: 复制代码 代码如下:  <table border="1">       <caption>信息统计表</caption>        <thead>        <tr >        <th>#</th>        </tr>

Excel中合并单元格的快捷键方法

1.首先,我们打开Excel表格,然后看看整个菜单栏中的栏目,如图所示: 2.在我们打开表格之后,然后我们点击菜单栏中的"工具",然后选择该选项中的"自定义",如图所示: 电脑教程 3.在我们选择"自定义"之后,就会发现弹出一个窗口,但是这个窗口对我们来说,不需要做任何的点击.然后我们找到工具栏,在居中并对其图标上单击鼠标右键,将会弹出下拉菜单,然后选择"总是文字",如图所示: 4.在选择"总是只用文字"之

Excel表格合并单元格快捷键设置方法

  大家都知道在Excel表格的使用过程,常常需要使用到"合并单元格"的这个功能.而需要操作"合并单元格"功能的时候,都需要将手移到鼠标上进行选择,非常费时间.如果有"合并单元格"的功能快捷键就方便多了!今天,小编就给大家介绍一下Excel表格表格合并单元格快捷键设置方法.赶紧来学习一下吧! 一.Excel表格合并单元格快捷键简单用法: 1.先合并一次单元格,然后合并单元格的快捷键就便车了:Alt+回车. 2这个方法适合短暂的使用合并单元格的快捷

excel公式把100单元格合并起来

  如果需要把A1:A2的内容合并起来,可以用公式 =A1&A2 如果需要把A1:A3的内容合并起来,可以用公式 =A1&A2&A3 如果把A1:A100的单元格合并起来呢? =A1&A2&A3... 公式太长了... 其实....不需要这样的.有一个神秘的函数可以帮我们解决: =PHONETIC(A1:A100) 利用phonetic函数就可以把前100行的内容连接到一起了. 如果,你在每个字符中间加个分隔号,如",",那就增加一个辅助列,在输

OpenXml 单元格合并后Word打开提示错误

问题描述 OpenXml 单元格合并后Word打开提示错误 string path = @"D:newdoc.docx" ; WordprocessingDocument doc = WordprocessingDocument.Create(path, WordprocessingDocumentType.Document) MainDocumentPart mainpart = doc.AddMainDocumentPart(); mainpart.Document = new D

Devexpresss 的Xtrareport 内容单元格合并问题

问题描述 Devexpresss 的Xtrareport 内容单元格合并问题 我知道: Xtrareport 里面的单元格属性可以设置成:processDuplicatesMode:merge这样就可以使某一列相同的数据的值 合并. 如果我想 在第一次合并的结果集中再二次合并呢? 举个例子 ID Name1 as1 as2 as2 as想得到如下的结果: 1 | as--|---2 |as 而不是: 1 | --| AS2 | 谢谢大家!怎么做?

c1flexgrid-C1FlexGrid 用户在界面编辑grid的单元格之后点击保存按钮但编辑的值并未保存。

问题描述 C1FlexGrid 用户在界面编辑grid的单元格之后点击保存按钮但编辑的值并未保存. 求解! C1FlexGrid界面修改单元格值后直接点击保存按钮,该值没有被保存进来-- 这个问题有谁遇到过? 请问怎样解决?或者是编辑后该值被存储在某个地方,怎样获取?请大牛们进来看看,多多指点! 解决方案 这个问题解决了,呵呵-- 希望可以帮到其他的友友~ 方法:点击保存时,在保存中添加代码:将焦点赋给该grid,问题解决~