ext grid合并单元格

/*rowspan grid合并行效果*/
.rowspan-grid .x-grid3-body .x-grid3-row {
    border:none;
    cursor:default;
    width:100%;
}
.rowspan-grid .x-grid3-header .x-grid3-cell{
    /*border-left: 2px solid transparent;*//*ie6的transparent下显示黑色?*/
    border-left: 2px solid #fff;
}
.rowspan-grid .x-grid3-body .x-grid3-row{
    overflow: hidden;
    border-right: 1px solid #ccc;
}
.rowspan-grid .x-grid3-body .x-grid3-cell {
    border: 1px solid #ccc;
    border-top:none;
    border-right:none;
}
.rowspan-grid .x-grid3-body .x-grid3-cell-first {
    /*border-left: 1px solid transparent;*/
    border-left: 1px solid #fff;
}
.rowspan-grid .x-grid3-body .rowspan-unborder {
    /*border-bottom:1px solid transparent;*/
    border-bottom:1px solid #fff;
}
.rowspan-grid .x-grid3-body .rowspan {
    border-bottom: 1px solid #ccc;
}

Ext.ns("Ext.ux.grid");
/**
 * 实现grid的rowspan效果
 *
 *  1.在列模型里需要配置合并行的列中设置rowspan属性,如:{dataIndex:'xxx', header:'xxx', rowspan:3} //该列每三行合并一行
 *  2.为grid设置view属性 => view : new ExtBuilder.grid.RowspanView()
 *  3.为grid设置cls属性 => cls : 'rowspan-grid'
 *  4.加入css样式
 */
Ext.ux.grid.RowspanView = Ext.extend(Ext.grid.GridView, {
    constructor: function(conf) {
        Ext.ux.grid.RowspanView.superclass.constructor.call(this, conf);
    },
    // private
    //清除合并的行中,非第一行的数据
    cleanRenderer : function(column, value, metaData, record, rowIndex, colIndex, store) {
        var rowspan = column.rowspan;
        if(!Ext.isEmpty(rowspan) && rowspan.length !== 0){
        	//var arrLast = new Array;
        	var recordFront = rowIndex === 0 ? null : store.getAt(rowIndex-1);
        	//var recordLast = rowIndex === store.getCount() ? null : store.getAt(rowIndex+1);
        	var isFront = false;
        	//var isLast = false;
        	for(var i = 0;i < rowspan.length; i++){
        		var key = rowspan[i];
        		if(recordFront != null && record.get(key) === recordFront.get(key)){
        			isFront = true;
        		}else{
        			isFront = false;
        		}
        	}
            if(isFront){
                return '';
            }
        }
        return column.renderer(value, metaData, record, rowIndex, colIndex, store);
    },
    // private
    doRender : function(cs, rs, ds, startRow, colCount, stripe){
        var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;
        var tstyle = 'width:'+this.getTotalWidth()+';';
        // buffers
        var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;

        //cmConfig列模型
        var cmConfig = this.cm.config, rowspans=[];
        //for(var i = 0, len = cmConfig.length; i < len; i++){
        //    rowspans.push(Math.max((cmConfig[i].rowspan || 0), 0));
        //}

        for(var j = 0, len = rs.length; j < len; j++){
            r = rs[j]; cb = [];
            var rowIndex = (j+startRow);
            for(var i = 0; i < colCount; i++){
                c = cs[i];
                p.id = c.id;
                p.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
                p.attr = p.cellAttr = "";
                p.value = this.cleanRenderer(cmConfig[i], r.data[c.name], p, r, rowIndex, i, ds);
                p.style = c.style;
                if(Ext.isEmpty(p.value)){
                    p.value = " ";
                }
                if(this.markDirty && r.dirty && typeof r.modified[c.name] !== 'undefined'){
                    p.css += ' x-grid3-dirty-cell';
                }
                //----------------------------------------------------------------------------
                //alert(this.cm.config[0].rowspan);
                //添加rowspan类,用样式实现合并行的效果
                var rowspan = cmConfig[i].rowspan;
                var record = r;
        				var recordFront = rowIndex === 0 ? null : ds.getAt(rowIndex-1);
        				var recordLast = rowIndex === ds.getCount() ? null : ds.getAt(rowIndex+1);
        				var isFront = false;
        				var isLast = false;
		        		 if(!Ext.isEmpty(rowspan) && rowspan.length !== 0){
			        		for(var k = 0;k < rowspan.length; k++){
			        			var key = rowspan[k];
			        			if(recordFront != null && record.get(key) === recordFront.get(key)){
			        				isFront = true;
			        			}else{
			        				isFront = false;
			        			}
			        			if(recordLast != null && record.get(key) === recordLast.get(key)){
			        				isLast = true;
			        			}else{
			        				isLast = false;
			        			}
			        		}
			        		if(!isLast ){
		        			 	p.css += ' rowspan';
		        			}else{
		        				p.css += ' rowspan-unborder';
		        			}
		        			
		        		}
        		
                /**
                if(rowspans[i] !== 0){
                    //每rowspan行以及最后一行加上rowspan类,即加上border-bottom
                    if(j == (len-1) || (rowIndex+1) % rowspans[i] === 0){
                        p.css += ' rowspan';
                    }else{
                        p.css += ' rowspan-unborder';
                    }
                }*/
                //----------------------------------------------------------------------------
                cb[cb.length] = ct.apply(p);
            }
            var alt = [];
            if(stripe && ((rowIndex+1) % 2 === 0)){
                alt[0] = "x-grid3-row-alt";
            }
            if(r.dirty){
                alt[1] = " x-grid3-dirty-row";
            }
            rp.cols = colCount;
            if(this.getRowClass){
                alt[2] = this.getRowClass(r, rowIndex, rp, ds);
            }
            rp.alt = alt.join(" ");
            rp.cells = cb.join("");
            buf[buf.length] =  rt.apply(rp);
        }
        return buf.join("");
    }
});

<html> <head>     <title>Rowspan (行合并)</title>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     <link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />

    <!-- GC -->    <!-- LIBS -->    <script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>    <!-- ENDLIBS -->

    <script type="text/javascript" src="../../ext-all.js"></script>

    <link rel="stylesheet" type="text/css" href="rowspan.css"/>     <script type="text/javascript" src="RowspanView.js"></script>     <script type="text/javascript">     <!--         Ext.onReady(function() {          var myData = [                 ['供电所1',6090,'大工业用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所1',6090,'非普工业用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所1',6090,'商业用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所1',6090,'住宅用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所1',6090,'售户数',15,'公用线',5,100,100,'公用变',57,100,100],                                 ['供电所1',6090,'城区用户数',0,'专用线',0,100,100,'专用变',51,100,100],                 ['供电所1',6090,'非城区用户数',0,'专用线',0,100,100,'专用变',51,100,100],                 ['供电所1',6090,'低压用户数',41,'专用线',0,100,100,'专用变',51,100,100],                 ['供电所1',6090,'未完成一户一表改造户数',0,'专用线',0,100,100,'专用变',51,100,100],                                 ['供电所2',6090,'大工业用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所2',6090,'非普工业用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所2',6090,'商业用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所2',6090,'住宅用电户数',15,'公用线',5,100,100,'公用变',57,100,100],                 ['供电所2',6090,'售户数',15,'公用线',5,100,100,'公用变',57,100,100],                                 ['供电所2',6090,'城区用户数',0,'专用线',0,100,100,'专用变',51,100,100],                 ['供电所2',6090,'非城区用户数',0,'专用线',0,100,100,'专用变',51,100,100],                 ['供电所2',6090,'低压用户数',41,'专用线',0,100,100,'专用变',51,100,100],                 ['供电所2',6090,'未完成一户一表改造户数',0,'专用线',0,100,100,'专用变',51,100,100]                ];                // create the data store             var store = new Ext.data.ArrayStore({                 fields: [                    {name: 'pass_name'},                    {name: 'user_num'},                    {name: 'user_name' },                    {name: 'user_count'},                    {name: 'dedicated_line' },                    {name: 'dedicated_num'},                    {name: 'colnum7'},                    {name: 'colnum8'},                    {name: 'colnum9'},                    {name: 'colnum10'},                    {name: 'colnum11'},                    {name: 'colnum12'}                 ]             });

            // manually load local data             store.loadData(myData);

            // create the Grid             var grid = new Ext.grid.EditorGridPanel({                 region:'center',                 store: store,                 columns: [                   {id:'pass_name', header: 'pass_name', width: 75,dataIndex: 'pass_name', rowspan: ['pass_name']},                     {header: 'user_num', width: 75,dataIndex: 'user_num', rowspan: ['pass_name'], editor : new Ext.form.NumberField()},                     {header: 'user_name', width: 75,dataIndex: 'user_name'},                     {header: 'user_count', width: 75,dataIndex: 'user_count', editor : new Ext.form.NumberField()},                     {header: 'dedicated_line', width: 75,dataIndex: 'dedicated_line', rowspan: ['dedicated_line']},                     {header: 'dedicated_num', width: 75,dataIndex: 'dedicated_num', rowspan: ['dedicated_line'], editor : new Ext.form.NumberField()},                     {header: 'colnum7', width: 75,dataIndex: 'colnum7', rowspan: ['pass_name'], editor : new Ext.form.NumberField()},                     {header: 'colnum8', width: 75,dataIndex: 'colnum8', rowspan: ['pass_name'], editor : new Ext.form.NumberField()},                     {header: 'colnum9', width: 75,dataIndex: 'colnum9', rowspan: ['colnum9']},                     {header: 'colnum10', width: 75,dataIndex: 'colnum10', rowspan: ['colnum9'], editor : new Ext.form.NumberField()},                     {header: 'colnum11', width: 75,dataIndex: 'colnum11', rowspan: ['pass_name'], editor : new Ext.form.NumberField()},                     {header: 'colnum12', width: 75,dataIndex: 'colnum12', rowspan: ['pass_name'], editor : new Ext.form.NumberField()}                 ],                 stripeRows: true,                 autoExpandColumn: 'pass_name',                 title: 'Array Grid',                 // config options for stateful behavior                 stateful: true,                 stateId: 'grid',                 cls: 'rowspan-grid',//******必须配置此样式                 view: new Ext.ux.grid.RowspanView() //****使用view             });

            var win = new Ext.Window({                 title:"行合并 demo",                 width:600,                 height:400,                 resizable:false,                 layout:'border',                 items:grid             });             win.show();         });     //-->     </script> </head> <body>

</body> </html>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值