首页 > 其他分享 >合并行的单元格 EXTJS

合并行的单元格 EXTJS

时间:2023-06-28 09:11:13浏览次数:38  
标签:rowspanObj rowspan 单元格 合并 arrayTd Ext var td EXTJS

在Ext JS 4中, 如何合并行的单元格, 已经选取的时候只能选择某一列, 期望的效果如下:

在Ext JS 中, 合并表头的列有现成方案, 但是合并行单元格不是extjs的现有功能,这个需要底层扩展, 也就是使用 table 的跨行实现。
而Ext JS 7以及新版本和Ext JS4在最底层的Grid组成上又有差别,所以不同版本的实现又存在一些差异。

实现思路

实现思路主要是两个:

  1. 在底层使用 rowspan 合并
  2. 设置Grid的选取方式为 cellmodel

完整代码

  1 /**
  2 * @param {} grid  要合并单元格的grid对象 
  3 * @param {} cols  要合并哪几列 例如 [1,2] 
  4 */
  5 var mergeCells = function (grid, cols) {
  6     //==>ExtJs4.2的<tbody>改到上层<table>的lastChild . <tbody>是各个<tr>的集合
  7     var arrayTr = document.getElementById(grid.getId() + "-body").firstChild.firstChild.lastChild.getElementsByTagName('tr');
  8     var trCount = arrayTr.length;  //<tr>总行数
  9     var arrayTd;
 10     var td;
 11 
 12     //==>显示层将目标格的样式改为.display='none';      
 13     var merge = function (rowspanObj, removeObjs)//定义合并函数  
 14     {
 15         if (0 != rowspanObj.rowspan) {
 16             arrayTd = arrayTr[rowspanObj.tr].getElementsByTagName("td"); //合并行  
 17             td = arrayTd[rowspanObj.td - 1];
 18             td.rowSpan = rowspanObj.rowspan;
 19             td.vAlign = "middle";
 20             //    td.style.font-size = '20px';
 21             //    $(td).hide();
 22             $(td).css("font-size", "15px");
 23             $(td).attr("title", $(td).text());
 24             $(td).find('span').attr("title", $(td).text());
 25             $(td).css('color', 'rgb(148, 201, 36)');
 26             var height = $(td).innerHeight();
 27             if (removeObjs.length > 0) {
 28                 $(td).css("padding-top", height / 3);
 29                 //    var showIndex = Math.ceil(removeObjs.length/2);
 30             }
 31 
 32             //隐身被合并的单元格  
 33             Ext.each(removeObjs, function (obj) {
 34                 arrayTd = arrayTr[obj.tr].getElementsByTagName("td");
 35                 arrayTd[obj.td - 1].style.display = 'none';
 36                 arrayTd[obj.td - 1].style.borderTop = "none";
 37             });
 38 
 39         }
 40     };
 41     //==>显示层将目标格的样式改为.display='none';     
 42 
 43     var rowspanObj = {}; //要进行跨列操作的td对象{tr:1,td:2,rowspan:5}      
 44     var removeObjs = []; //要进行删除的td对象[{tr:2,td:2},{tr:3,td:2}]  
 45     var col;
 46     //==>逐列靠表内具体数值去合并各个<tr> (表内数值一样则合并) 
 47 
 48     try {
 49         Ext.each(cols, function (colIndex) {
 50             var rowspan = 1;
 51             var divHtml = null;//单元格内的数值          
 52             for (var i = 0; i < trCount; i++)//==>从第一行数据0开始
 53             {
 54                 //==>一个arrayTr[i]是一整行的所有数据, 一个arrayTd是 <td xxxx ><div>具体数值</div></td> ,
 55                 arrayTd = arrayTr[i].getElementsByTagName("td");
 56                 var cold = 0;
 57                 //          Ext.each(arrayTd,function(Td){ //获取RowNumber列和check列  
 58                 //              if(Td.getAttribute("class").indexOf("x-grid-cell-special") != -1)  
 59                 //                  cold++;                               
 60                 //          });  
 61                 col = colIndex + cold;//跳过RowNumber列和check列  
 62 
 63                 if (!divHtml) {
 64                     divHtml = arrayTd[col - 1].innerHTML;
 65                     divHtml = $(divHtml).text(); //==>拿到真正数值,相比Ext4.1多了一层<div>
 66                     rowspanObj = { tr: i, td: col, rowspan: rowspan }
 67                 }
 68                 else {
 69                     var cellText = arrayTd[col - 1].innerHTML;
 70                     cellText = $(cellText).text();//==>拿到真正数值 
 71 
 72 
 73                     var addf = function () {
 74                         rowspanObj["rowspan"] = rowspanObj["rowspan"] + 1;
 75                         removeObjs.push({ tr: i, td: col });
 76                         if (i == trCount - 1) {
 77                             merge(rowspanObj, removeObjs);//执行合并函数  
 78                         }
 79                     };
 80                     var mergef = function () {
 81                         merge(rowspanObj, removeObjs);//执行合并函数  
 82                         divHtml = cellText;
 83                         rowspanObj = { tr: i, td: col, rowspan: rowspan }
 84                         removeObjs = [];
 85                     };
 86 
 87                     if (cellText == divHtml) {
 88                         if (colIndex != cols[0]) {
 89                             var leftDisplay = arrayTd[col - 2].style.display;//判断左边单元格值是否已display  
 90                             if (leftDisplay == 'none') {
 91                                 addf();
 92                             }
 93                             else {
 94                                 mergef();
 95                             }
 96                         }
 97                         else {
 98                             addf();
 99                         }
100                     }
101                     else {
102                         mergef();
103                     }
104                 }
105             }
106         });
107     } catch (e) {
108         console.log(e.message)
109     }
110 };
111 
112 
113 
114 
115 Ext.onReady(function () {
116 
117     var store = Ext.create('Ext.data.Store', {
118         storeId: 'myStore',
119         autoLoad: false,
120         fields: ['firstClass', 'secondClass'],
121         data: {
122             'items':
123                 [{
124                     firstClass: '正极材料',
125                     secondClass: '镍钴锰酸锂'
126                 }, {
127                     firstClass: '正极材料',
128                     secondClass: '锰酸锂'
129                 }, {
130                     firstClass: '负极材料',
131                     secondClass: '石墨'
132                 }, {
133                     firstClass: '负极材料',
134                     secondClass: '六弗锰酸锂'
135                 }]
136         },
137         proxy: {
138             type: 'memory',
139             reader: {
140                 type: 'json',
141                 root: 'items'
142             }
143         }
144     });
145 
146     var grid = Ext.create('Ext.grid.Panel', {
147         renderTo: Ext.getBody(),
148         selType: 'cellmodel',
149         /*tbar: [{
150             text: '单元格合并',
151             handler: function () {
152                 mergeCells(grid, [1]);
153             }
154         }],*/
155         id: 'mygrid',
156         columns: [{
157             text: '一级分类',
158             dataIndex: 'firstClass'
159         }, {
160             text: '二级分类',
161             dataIndex: 'secondClass'
162         }],
163         store: store
164     });
165 
166     setTimeout(function(){
167         mergeCells(grid, [1]);
168     },100)
169     /* grid.getStore().load(function(){
170          alert('1');
171          mergeCells(grid, [1]);
172      });*/
173 });

 

标签:rowspanObj,rowspan,单元格,合并,arrayTd,Ext,var,td,EXTJS
From: https://www.cnblogs.com/luchaoshuai/p/17510466.html

相关文章

  • leetcode 21. 合并两个有序链表
    直接合并即可这道题是简单题,直接合并即可/**Definitionforsingly-linkedlist.publicclassListNode{intval;ListNodenext;ListNode(){}ListNode(intval){this.val=val;}ListNode(intval,ListNodenext){this.val=val;this.next=nex......
  • nginx RTMP推拉流,多个音频流合并。
    使用nginxRTMP(nginx的一个插件模块,具体的网上搜一下)做一个简易的多人音频通话流媒体服务器,多个端通话时,客户端无法处理其他端发过来的音频流,比如A、B、C三个端通话,A设备同时持有B、C的音频流,这样对设备端非常的不友好。这时候就需要用到一个强大的工具,FFMPEG,安装网上很多,搜下就......
  • 2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状
    2023-06-26:在大小为nxn的网格grid上,每个单元格都有一盏灯,最初灯都处于关闭状态给你一个由灯的位置组成的二维数组lamps其中lamps[i]=[rowi,coli]表示打开位于grid[rowi][coli]的灯即便同一盏灯可能在lamps中多次列出,不会影响这盏灯处于打开状态当一盏灯处于......
  • 代码随想录算法训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中
     654.最大二叉树 比较简单,直接上代码1TreeNode*constructMax_cursor(vector<int>&nums)2{3if(nums.size()==0)returnNULL;4//getMaxNum5intindex=0;6intmax_=INT_MIN;7for(inti=0;i<nums.size();i++)8......
  • node服务 图片合并echarts图表,绘制方框
    效果图:环境及依赖配置node版本参考:v14.18.3npm版本参考:6.14.15环境安装Mac系统需要先将Homebrew升级到与系统匹配的版本系统命令MacOSXbrewinstallpkg-configcairopangolibpngjpeggifliblibrsvgpixmanUbuntusudoapt-getinstallbuild-essentia......
  • 【已解决】【Tensorflow2.12.0版本以后合并CPU和GPU版】Tensorflow-gpu==2.12.0 安装
    !https://zhuanlan.zhihu.com/p/639416152解决方式:直接上解决方式,需要知道原因的看后文。直接安装tensroflow,从2022年12月起tensorflow-gpu已经合并到tensorflow包中了pipinstalltensorflow==2.12.0-ihttps://pypi.tuna.tsinghua.edu.cn/simple这里使用清华源......
  • 爆爆爆!!Deep Mind与Google Brain合并,成立 Google DeepMind 新部门
    图|2010-2023,从DeepMind到GoogleDeepMind,再到DeepMind,再到GoogleDeepMind或许是深深感受到了来自OpenAI与微软一起给到的巨大压力,以及加速实现通用人工智能(AGI)的目标,今日,GoogleCEOSundarPichai宣布,将DeepMind、GoogleBrain合并,成立GoogleDeepMind。DemisHassabis......
  • PostgreSQL合并多行数据为一行,string_agg函数
    通过id列来聚合belong_user_saved列,应用string_agg函数,只要id一样则把第二列通过逗号连接起来聚合前:聚合后:SELECT C.ID, string_agg(u.name::varchar,',')belong_user_savedFROM customerC leftjoincustomer_territoryctonct.customer=c.id leftjoinuser_......
  • 远程提交代码冲突合并流程
    步骤1:获取源代码,本地进行分支合并.gitfetchorigingitcheckout当前分支gitmergeorigin/xxx这里没太明白,反正就是远端的分支,origin/远端分支版本步骤2:查看冲突文件,本地解决冲突.步骤3:推送至源分支,修改直接展示在当前合并请求中.gitadd.gitcommit-m'fix......
  • excel2016选中单元格怎么高亮显示选中的行和列
    excel2016怎么高亮显示选中的行和列第一步:首先我们在电脑上用excel2016打开要编辑的表格,然后选中要整个表格的数据区域第二步:接下来依次点击开始工具栏上的“条件格式/新建规则”菜单项。接着在打开的新建格式规则的窗口中,我们选中“使用公式确定要设......