extjs grid 怎样合并单元格?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了extjs grid 怎样合并单元格?相关的知识,希望对你有一定的参考价值。

姓名 | 性别| 年龄|
-------------------------
| |
合并 ------------------
| |
-------------------------

具体步骤如下:
/*
这个方法四个参数分别是
row:合并起始行
col:合并起始列.这两个参数是为了定位,要从哪个单元格开始合并.
type:是要合并行或者列.
num:是要合并的数量

//==>监听load , 执行合并单元格
grid.getStore().on('load', function ()
span(grid, 0, 0, 'row', 5);
);
*/
var span = function (grid, row, col, type, num)
switch (type)
case 'row':
tds = Ext.get(grid.view.getNode(row)).query('td');
Ext.get(tds[col]).set( rowspan: num );
Ext.get(Ext.get(tds[col])).setStyle( 'vertical-align': 'middle' );
for (i = row + 1; i < row + num; i++)
Ext.get(Ext.get(grid.view.getNode(i)).query('td')[col]).destroy();

break;
case 'col':
tds = Ext.get(grid.view.lockedView.getNode(row)).query('td');
Ext.get(tds[col]).set( colspan: num );
break;

;
参考技术A 如果只是合并表头的话那好弄,官方例子里就有,但是合并内容的话我记得extjs4.0才有这个功能,如果你想在3.0里实现的话恐怕要重写grid或者用模板Template不知道行不行追问

我是3.0 那重写grid 怎么弄?模板在哪里,你有吗?

追答

不好意思,具体怎么弄那要靠你自己了,我也在上班,没有时间研究这个,只能给你思路:
1、重写用Ext.extend()这个方法,具体使用请看API
2、用模板的话Ext有一个Template类,API里也有,你自己学习一下吧

追问

嗯,理解,谢谢了,那注意休息。我也上班,好累

本回答被提问者采纳
参考技术B 用“&”键 可以使两个单元格内容合并追问

具体点,我不理解呀,谢谢了

追答

就是 在另一单元格用 “A1&A2” 这样A1和A2单元格的内容就合并了

ExtJS 4.2 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

 

==================================系列文章==========================================

本篇文章:7.8  ExtJS 4.2 Grid组件的单元格合并

Web开发之路系列文章

 

以上是关于extjs grid 怎样合并单元格?的主要内容,如果未能解决你的问题,请参考以下文章

Extjs gridpanel 合并单元格

extjs5 grid如何实现根据后台返回的数据 合并相应的单元格或是行数

MFC中GridCtrl合并单元格SetCellCombine出错

求高手解答,vb中如何合并grid指定位置的表格?(例如:第一行的,第二行的3.4列)

如何在Kendo UI Grid中合并单元格

在EXCEL中把上下两单元格合并了,怎样才能使文字上下居中呢?