/*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>
