extjs3合并表头 rowspan

本文介绍如何在ExtJS3中实现表格表头的行合并,由于ColumnHeaderGroup控件无法满足需求,作者选择直接修改extjs的源码。通过在grid中添加rows属性,设置每个单元格的colspan和rowspan属性,实现了自定义的行合并效果。详细过程包括对extjs-all-debug.js中renderHeaders方法的改写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

extjs3的表头合并,虽然有ColumnHeaderGroup控件,但是这个控件无法实现合并行rowspan,显示太丑,为此只能自己去改extjs的源码,先上效果


grid中增加属性rows,rows的内容为

{header: ‘列名’,align: 'center',2: colspan,rowspan:1}组成的数组


 var cm = new Ext.grid.ColumnModel([
	{
		header : 'xx',
		sortable : false,
		dataIndex : 'V1'
	},{
		header : 'xx',
		sortable : false,
		dataIndex : 'V2'
	},{
		header : 'xx',
		sortable : false,
		dataIndex : 'V3'
	},{
		header : 'qq',
		sortable : false,
		hidden:true,
		dataIndex : 'V4'
	} ]);
	cm.rows=[[{header: '测试1',align: 'center',colspan: 2,rowspan:1},{header: '测试2',align: 'center',colspan: 2,rowspan:1}],
						      [{header: '测试3',align: 'center',colspan: 1,rowspan:2},{header: '测试4',align: 'center',colspan: 1,rowspan:1},
						       {header: '测试5',align: 'center',colspan: 1,rowspan:1},{header: '测试6',align: 'center',colspan: 1,rowspan:1}]];
	
		  var grid=new Ext.grid.GridPanel({
					   renderTo : 'content', 
						autoScroll : true ,
						loadMask : {
							msg : '正在加载数据,请稍侯……',
							removeMask: true
						}, 
						stripeRows : false,//不需要隔行换色
						store : store,
						height : 500,
						frame : true,
						clicksToEdit : 2,
						cm : cm, 
						trackMouseOver : true,
						disableSelection : true, 
						viewConfig : {
						forceFit : false
						}  
						  
					});


1、首先在extjs-all-debug.js中找到renderHeaders方法进行改写

renderHeaders : function() {
        var cm   = this.cm,
            ts   = this.templates,
            ct   = ts.hcell,
            cb   = [],
            p    = {},
            len  = cm.getColumnCount(),
            rows = this.cm.rows,
            last = len - 1;
 
        /** add by wly 20160722**/
        var cellHead="";
        var colgroup='';
        if(rows !=undefined){
        	colgroup='<colgroup>';
	        for(var row = 0, rlen = rows.length;  row < rlen;row++){
	            var r = rows[row], cells = [];
 	            for(var i = 0, gcol = 0, len = r.length; i < len; i++){
	                var group = r[i];
	                group.colspan = group.colspan || 1;
 
	                p.id = 0;
                    p.value = group.header || '';  
                    p.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
                    p.css=p.css+' ux-grid-hd-group-row-'+id+' ux-grid-hd-group-cell ';
                    p.colspan=group.colspan;
                    p.rowspan=group.rowspan;
                    if(p.colspan==0) p.colspan=1;
                   
                    cells[i] = ct.apply(p);
            
	                 
	                gcol += group.colspan;
	            }
	            
	            cellHead=cellHead+'<tr class="x-grid3-hd-row">'+cells.join('')+'</tr>';
	        }
        }
        
        /** add by wly 20160722**/
        
        for (var i = 0; i < len; i++) {
        	colgroup=colgroup+' <col width="'+this.getColumnWidth(i).replace('px','')+'"></col>';   /** add by wly 20160722**/
        	
        
        	 
            p.id = cm.getColumnId(i);
            p.value = cm.getColumnHeader(i) || '';
            p.style = this.getColumnStyle(i, true);
            p.tooltip = this.getColumnTooltip(i);
            p.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');

            if (cm.config[i].align == 'right') {
                p.istyle = 'padding-right:16px';
            } else {
                delete p.istyle;
            }
            
            	cb[cb.length] = ct.apply(p);
             
        }
 
        if(rows !=undefined){
        	return ts.header.apply({colgroup:colgroup,cells:cellHead+'<tr class="x-grid3-hd-row">'+cb.join('')+'</tr>', tstyle:'width:'+this.getTotalWidth()+';'});

        }else{
        	return ts.header.apply({colgroup:'',cells: '<tr class="x-grid3-hd-row">'+cb.join('')+'</tr>', tstyle:'width:'+this.getTotalWidth()+';'});

        }
         
        
    },



<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">2、找到header模板,进行修改</span>

if(!ts.header){
            ts.header = new Ext.Template(
                '<table border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
//                '<thead><tr class="x-grid3-hd-row">{cells}</tr></thead>',
                '{colgroup}<thead>{cells}</thead>', //modify by wly 20160722
                '</table>'
            );
        }



3、修改列拖动方法找updateColumnWidth方法,增加getColGroup方法调用和设置宽度

updateColumnWidth : function(col, width){
        var w = this.getColumnWidth(col);
        var tw = this.getTotalWidth();
        this.innerHd.firstChild.style.width = this.getOffsetWidth();
        this.innerHd.firstChild.firstChild.style.width = tw;
        this.mainBody.dom.style.width = tw;
        var hd = this.getHeaderCell(col);
        hd.style.width = w;
        
        /** add my wly 20160722 mutihead**/
        var colgroup=this.getColgroup(col);
        if(colgroup !=undefined)  colgroup.style.width=w;

        var ns = this.getRows(), row;
        for(var i = 0, len = ns.length; i < len; i++){
            row = ns[i];
            row.style.width = tw;
            if(row.firstChild){
                row.firstChild.style.width = tw;
                row.firstChild.rows[0].childNodes[col].style.width = w;
            }
        }

        this.onColumnWidthUpdated(col, w, tw);
    },

找到getHeaderCell方法,在下面增加方法

getColgroup : function(index){ 
    	/** add by wly 20160722**/ 
    	 return this.mainHd.dom.getElementsByTagName('col')[index];
    },

注意引入ColumnHeaderGroup.css

完整代码上传审批没通过,现已上传百度网盘 http://pan.baidu.com/s/1bO9NQI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值