• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 娅水9213 | 发布时间: 2025-8-13 22:24| 查看数: 97| 评论数: 0|帖子模式

    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 代码
    1.  /**
    2. * 合并Grid的数据列
    3. * @param grid {Ext.Grid.Panel} 需要合并的Grid
    4. * @param colIndexArray {Array} 需要合并列的Index(序号)数组;从0开始计数,序号也包含。
    5. * @param isAllSome {Boolean} 是否2个tr的colIndexArray必须完成一样才能进行合并。true:完成一样;false:不完全一样
    6. */
    7. function mergeGrid(grid, colIndexArray, isAllSome) {
    8. isAllSome = isAllSome == undefined ? true : isAllSome; // 默认为true

    9. // 1.是否含有数据
    10. var gridView = document.getElementById(grid.getView().getId() + '-body');
    11. if (gridView == null) {
    12. return;
    13. }

    14. // 2.获取Grid的所有tr
    15. var trArray = [];
    16. if (grid.layout.type == 'table') { // 若是table部署方式,获取的tr方式如下
    17. trArray = gridView.childNodes;
    18. } else {
    19. trArray = gridView.getElementsByTagName('tr');
    20. }

    21. // 3.进行合并操作
    22. if (isAllSome) { // 3.1 全部列合并:只有相邻tr所指定的td都相同才会进行合并
    23. var lastTr = trArray[0]; // 指向第一行
    24. // 1)遍历grid的tr,从第二个数据行开始
    25. for (var i = 1, trLength = trArray.length; i < trLength; i++) {
    26.   var thisTr = trArray[i];
    27.   var isPass = true; // 是否验证通过
    28.   // 2)遍历需要合并的列
    29.   for (var j = 0, colArrayLength = colIndexArray.length; j < colArrayLength; j++) {
    30.   var colIndex = colIndexArray[j];
    31.   // 3)比较2个td的列是否匹配,若不匹配,就把last指向当前列
    32.   if (lastTr.childNodes[colIndex].innerText != thisTr.childNodes[colIndex].innerText) {
    33.    lastTr = thisTr;
    34.    isPass = false;
    35.    break;
    36.   }
    37.   }

    38.   // 4)若colIndexArray验证通过,就把当前行合并到'合并行'
    39.   if (isPass) {
    40.   for (var j = 0, colArrayLength = colIndexArray.length; j < colArrayLength; j++) {
    41.    var colIndex = colIndexArray[j];
    42.    // 5)设置合并行的td rowspan属性
    43.    if (lastTr.childNodes[colIndex].hasAttribute('rowspan')) {
    44.    var rowspan = lastTr.childNodes[colIndex].getAttribute('rowspan') - 0;
    45.    rowspan++;
    46.    lastTr.childNodes[colIndex].setAttribute('rowspan', rowspan);
    47.    } else {
    48.    lastTr.childNodes[colIndex].setAttribute('rowspan', '2');
    49.    }
    50.    // lastTr.childNodes[colIndex].style['text-align'] = 'center';; // 水平居中
    51.    lastTr.childNodes[colIndex].style['vertical-align'] = 'middle';; // 纵向居中
    52.    thisTr.childNodes[colIndex].style.display = 'none';
    53.   }
    54.   }
    55. }
    56. } else { // 3.2 逐个列合并:每个列在前面列合并的前提下可分别合并
    57. // 1)遍历列的序号数组
    58. for (var i = 0, colArrayLength = colIndexArray.length; i < colArrayLength; i++) {
    59.   var colIndex = colIndexArray[i];
    60.   var lastTr = trArray[0]; // 合并tr,默认为第一行数据
    61.   // 2)遍历grid的tr,从第二个数据行开始
    62.   for (var j = 1, trLength = trArray.length; j < trLength; j++) {
    63.   var thisTr = trArray[j];
    64.   // 3)2个tr的td内容一样
    65.   if (lastTr.childNodes[colIndex].innerText == thisTr.childNodes[colIndex].innerText) {
    66.    // 4)若前面的td未合并,后面的td都不进行合并操作
    67.    if (i > 0 && thisTr.childNodes[colIndexArray[i - 1]].style.display != 'none') {
    68.    lastTr = thisTr;
    69.    continue;
    70.    } else {
    71.    // 5)符合条件合并td
    72.    if (lastTr.childNodes[colIndex].hasAttribute('rowspan')) {
    73.     var rowspan = lastTr.childNodes[colIndex].getAttribute('rowspan') - 0;
    74.     rowspan++;
    75.     lastTr.childNodes[colIndex].setAttribute('rowspan', rowspan);
    76.    } else {
    77.     lastTr.childNodes[colIndex].setAttribute('rowspan', '2');
    78.    }
    79.    // lastTr.childNodes[colIndex].style['text-align'] = 'center';; // 水平居中
    80.    lastTr.childNodes[colIndex].style['vertical-align'] = 'middle';; // 纵向居中
    81.    thisTr.childNodes[colIndex].style.display = 'none'; // 当前行隐藏
    82.    }
    83.   } else {
    84.    // 5)2个tr的td内容不一样
    85.    lastTr = thisTr;
    86.   }
    87.   }
    88. }
    89. }
    90. } 
    复制代码
    3.2 在线演示
    在线演示:http://www.akmsg.com/ExtJS/index.html#App.Demo.MergeGridTab
    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表