Extjs 实现多行合并(rowspan)效果实现二

RowspanView.css

<style>
    .spanScore {display:block;text-align:center;}
        .x-grid3-row td, .x-grid3-summary-row td{
            padding-right: 0px;
            padding-left: 0px;
            padding-top: 0px;
            padding-bottom: 0px;
        }
        .x-grid3-row {
            border-right-width: 0px;
            border-left-width: 0px;
            border-top-width: 0px;
            border-bottom-width: 0px;
        }
        .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 #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 #fff;
        }
        .rowspan-grid .x-grid3-body .rowspan-unborder {
           
            border-bottoRowspanView.js
        .rowspan-grid .x-grid3-body .rowspan {
            border-bottom: 1px solid #ccc;
        }
</style>

RowspanView.js

/*
**合并单元格的函数,合并表格内所有连续的具有相同值的单元格。调用方法示例:
**store.on("load",function(){gridSpan(grid,"row","[FbillNumber],[FbillDate],[FAudit],[FAuditDate],[FSure],[FSureDate]","FbillNumber");});
**参数:grid-需要合并的表格,rowOrCol-合并行还是列,cols-需要合并的列(行合并的时候有效),sepCols以哪个列为分割(即此字段不合并的2行,其他字段也不许合并),默认为空
*/
function gridSpan(grid, rowOrCol, cols, sepCol){
    var array1 = new Array();
    var arraySep = new Array();
    var count1 = 0;
    var count2 = 0;
    var index1 = 0;
    var index2 = 0;
    var aRow = undefined;
    var preValue = undefined;
    var firstSameCell = 0;
    var allRecs = grid.getStore().getRange();
    if(rowOrCol == "row"){
        count1 = grid.getColumnModel().getColumnCount();
        count2 = grid.getStore().getCount();
    } else {
        count1 = grid.getStore().getCount();
        count2 = grid.getColumnModel().getColumnCount();
    }
    for(i = 0; i < count1; i++){
        if(rowOrCol == "row"){
            var curColName = grid.getColumnModel().getDataIndex(i);
            var curCol = "[" + curColName + "]";
            if(cols.indexOf(curCol) < 0)
            continue;
        }
        preValue = undefined;
        firstSameCell = 0;
        array1[i] = new Array();
        for(j = 0; j < count2; j++){
            if(rowOrCol == "row"){
                index1 = j;
                index2 = i;
            } else {
                index1 = i;
                index2 = j;
            }
            var colName = grid.getColumnModel().getDataIndex(index2);
            if(sepCol && colName == sepCol)
            arraySep[index1] = allRecs[index1].get(sepCol);
            var seqOldValue = seqCurValue = "1";
            if(sepCol && index1 > 0){
                seqOldValue = arraySep[index1 - 1];
                seqCurValue = arraySep[index1];
            }
             
            if(allRecs[index1].get(colName) == preValue && (colName == sepCol || seqOldValue == seqCurValue)){
//                 alert(colName + "======" + seqOldValue + "======" + seqCurValue);
                 allRecs[index1].set(colName, "");
                 array1[i].push(j);
                 if(j == count2 - 1){
                     var index = firstSameCell + Math.round((j + 1 - firstSameCell) / 2 - 1);
                     if(rowOrCol == "row"){
                         allRecs[index].set(colName, preValue);
                       } else {
                           allRecs[index1].set(grid.getColumnModel().getColumnId(index), preValue);
                       }
                   }
               } else {
                   if(j != 0){
                       var index = firstSameCell + Math.round((j + 1 - firstSameCell) / 2 - 1);
                       if(rowOrCol == "row"){
                           allRecs[index].set(colName, preValue);
                       } else {
                           allRecs[index1].set(grid.getColumnModel().getColumnId(index), preValue);
                    }
                   }
               firstSameCell = j;
               preValue = allRecs[index1].get(colName);
               allRecs[index1].set(colName, "");
               if(j == count2 - 1){
                   allRecs[index1].set(colName, preValue);
               }
           }
        }
    }
    grid.getStore().commitChanges();
    //添加所有分隔线
    var rCount = grid.getStore().getCount();
    for(i = 0; i < rCount; i ++){
        for(j = 0; j < grid.getColumnModel().getColumnCount(); j ++){
               aRow = grid.getView().getCell(i,j);
             if(i == 0){
                 aRow.style.borderTop = "none";
                 aRow.style.borderLeft = "1px solid #ccc";
             }else if(i == rCount - 1){
                 aRow.style.borderTop = "1px solid #ccc";
                 aRow.style.borderLeft = "1px solid #ccc";
                aRow.style.borderBottom = "1px solid #ccc";
             }else{
                 aRow.style.borderTop = "1px solid #ccc";
                 aRow.style.borderLeft = "1px solid #ccc";
             }
             if(j == grid.getColumnModel().getColumnCount()-1)
                 aRow.style.borderRight = "1px solid #ccc";
            if(i == rCount-1)     
             aRow.style.borderBottom = "1px solid #ccc";
           }
       }
       //去除合并的单元格的分隔线
       for(i = 0; i < array1.length; i++){
           if(!Ext.isEmpty(array1[i])){
               for(j = 0; j < array1[i].length; j++){
                   if(rowOrCol == "row"){
                       aRow = grid.getView().getCell(array1[i][j],i);
                       aRow.style.borderTop = "none";
                   } else {
                       aRow = grid.getView().getCell(i, array1[i][j]);
                       aRow.style.borderLeft = "none";
                   }
               }
           }
       }
}

Example

acceptDept.jsp

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/commons/taglibs.jsp"%>
<html>
<head>
<%@ include file="/commons/meta.jsp"%>
<%@ include file="/commons/ext.jsp"%>
<script type="text/javascript" src="acceptDept.js"></script>
<style>
.x-grid3-row td, .x-grid3-summary-row td{
    padding-right: 0px;
    padding-left: 0px;
    padding-top: 0px;
    padding-bottom: 0px;
}
.x-grid3-row {
    border-right-width: 0px;
    border-left-width: 0px;
    border-top-width: 0px;
    border-bottom-width: 0px;
}
.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 #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 #fff;
}
.rowspan-grid .x-grid3-body .rowspan-unborder {
    border-bottom:1px solid #fff;
}
.rowspan-grid .x-grid3-body .rowspan {
    border-bottom: 1px solid #ccc;
}
</style>
<title>按接收部门</title>
</head>
<body>
</body>
</html>

acceptDept.js

Ext.ns('Ext.acceptDept');
var stateGrid;
Ext.acceptDept.main = function() {
    var mainGrid;
    var win;
    // 创建显示窗口
    return {
        init : function() {
            this.initBasicForm();
            this.initWin();
        },
        initBasicForm : function() {
            var tb = new Ext.Toolbar({
                items : [{
                    xtype : 'tbseparator'
                }, {
                    xtype : 'tbbutton',
                    text : '关闭',
                    iconCls : 'silk_cancel',
                    handler : function() {
                        close()
                    }
                }]
            });
            
            var itemStore = new Ext.data.JsonStore({
                url : ctx + '/acceptDept.do?method=getAcceptDept',
                root : 'root',
                totalProperty : 'totalCount',
                autoLoad : true,
                fields : [{
                    name : 'INFO_REGISTER_ID',
                    mapping : 'INFO_REGISTER_ID'
                }, {
                    name : 'OPERATE_DEPT',
                    mapping : 'OPERATE_DEPT'
                }, {
                    name : 'OPERATE_PERSON_DEPT_NAME',
                    mapping : 'OPERATE_PERSON_DEPT_NAME'
                }, {
                    name : 'SEND_PERSON',
                    mapping : 'SEND_PERSON'
                }, {
                    name : 'SEND_PERSON_NAME',
                    mapping : 'SEND_PERSON_NAME'
                }, {
                    name : 'INFO_TYPE_NAME',
                    mapping : 'INFO_TYPE_NAME'
                }, {
                    name : 'OPERATE_DATE',
                    mapping : 'OPERATE_DATE'
                }, {
                    name : 'SEND_DATE',
                    mapping : 'SEND_DATE'
                }, {
                    name : 'RESPONSES_FLAG',
                    mapping : 'RESPONSES_FLAG'
                }, {
                    name : 'RECEIVE_PERSON',
                    mapping : 'RECEIVE_PERSON'
                }, {
                    name : 'RECEIVE_PERSON_NAME',
                    mapping : 'RECEIVE_PERSON_NAME'
                }, {
                    name : 'RECEIVE_DEPT_NAME',
                    mapping : 'RECEIVE_DEPT_NAME'
                }, {
                    name : 'RECEIVE_PERSON_DEPT',
                    mapping : 'RECEIVE_PERSON_DEPT'
                }, {
                    name : 'REGISTER_CONTENT',
                    mapping : 'REGISTER_CONTENT'
                }, {
                    name : 'DISPOSE_CONTENT',
                    mapping : 'DISPOSE_CONTENT'
                }, {
                    name : 'DISPOSE_TYPE',
                    mapping : 'DISPOSE_TYPE'
                }, {
                    name : 'DISPOSE_DATE',
                    mapping : 'DISPOSE_DATE'
                }]
            })
            
            var cm = new Ext.grid.ColumnModel([{
                header : '所队',
                dataIndex : 'RECEIVE_DEPT_NAME',
                width : 300
            }, {
                header : '接收时间',
                dataIndex : 'SEND_DATE',
                width : 120
            }, {
                header : '反馈人员',
                dataIndex : 'SEND_PERSON_NAME',
                width : 100
            }, {
                header : '要求处理',
                dataIndex : 'RESPONSES_FLAG',
                width : 100,
                renderer : function responsesFlag (value) {
                    if (value == 1) {
                        return "是";
                    } else {
                        return "否";
                    }
                }
            }, {
                header : '当前状态',
                dataIndex : 'DISPOSE_TYPE',
                width : 100,
                renderer : function disposeType (value) {
                    if (value == 1) {
                        return "已转发";
                    } else if (value == 2){
                        return "已处理";
                    } else {
                        return "未处理";
                    }
                }
            }, {
                header : '接收人员',
                dataIndex : 'RECEIVE_PERSON_NAME',
                width : 100
            }, {
                header : '反馈类型',
                dataIndex : 'INFO_TYPE_NAME',
                width : 150
            }, {
                header : '反馈内容',
                dataIndex : 'REGISTER_CONTENT',
                width : 300
            }, {
                header : '处理情况',
                dataIndex : 'DISPOSE_CONTENT',
                width : 300
            }, {
                header : '处理时间',
                dataIndex : 'DISPOSE_DATE',
                width : 120
            }]);
            // 专卖基础信息主表
            mainGrid = new Ext.grid.GridPanel({
                tbar : tb,
                region : 'center',
                autoWidth : true,
                height : document.body.clientHeight * 0.5,
                autoScroll : true,
                store : itemStore,
                stripeRows : true,
                frame : true,
                loadMask : {msg:"数据加载中,请稍等..."},
                cm : cm,
                viewConfig : {
                    forceFit : true,
                    autoScroll: true
                }
            });
            
            //加载之前保存查询条件
            itemStore.on('beforeload',function(ds){
                var receive_dept = Ext.getCmp('receive_dept_d').getValue();
                var respon_dept = Ext.getCmp('respon_dept_d').getValue();
                var type = Ext.getCmp('type_d').getValue();
                var unitId = Ext.getCmp('unitId_d').getValue();
                var deptCode = Ext.getCmp('deptCode_d').getValue();
                var operPersonCode = Ext.getCmp('operPersonCode_d').getValue();    
                var yearMonth = Ext.getCmp('yearMonth_d').getValue();    
//                alert("receive_dept=="+receive_dept+";\n respon_dept=="+respon_dept+";\n type=="+type+";\n unitId=="+unitId+";\n deptCode=="+deptCode+";\n operPersonCode=="+operPersonCode+";\n yearMonth=="+yearMonth);
                ds.baseParams ={
                           receivePersonDept : receive_dept,
                           operateDept : respon_dept,
                           type : type,
                           operateOrg : unitId,
                           sendDate : yearMonth,
                           deptCode : deptCode,
                           operPersonCode : operPersonCode
                }
            });

            // 默认选中第一行
            mainGrid.store.on("load", function() {
                mainGrid.getSelectionModel().selectFirstRow();
                gridSpan(mainGrid,"row","[RECEIVE_DEPT_NAME]","");
            });
            mainGrid.getSelectionModel().on("rowselect", function(t, rowIndex, record) {
                stateGrid.getStore().load({
                    params : {
                           infoRegisterId : record.get('INFO_REGISTER_ID'),
                           personCode : '-1',
                           unitId : '-1',
                           deptCode : '-1'
                    }
                });
            });
            
            function dealDetail(value, cellmeta, record, rowIndex, columnIndex, store){
                if(value!='填报')
                  return "<a style='color: blue;cursor:hand;' onclick='dealWindow(2,0,0)'>查看处理</a>";
            }
            
            var stateStore=new Ext.data.JsonStore({
                url :  ctx + "/acceptDept.do?method=getStateInfo",
                root : 'root',
                totalProperty : 'totalCount',
                autoLoad : false,
                fields : [
                        {name:'INFO_REGISTER_ID',mapping:'INFO_REGISTER_ID'},
                        {name:'INFO_RESPONSES_ID',mapping:'INFO_RESPONSES_ID'},
                        {name:'SEND_DATE',mapping:'SEND_DATE'},
                        {name:'DISPOSE_DATE',mapping:'DISPOSE_DATE'},
                        {name:'TYPE',mapping:'TYPE'},
                        {name:'PERSON_CODE',mapping:'PERSON_CODE'},
                        {name:'PERSON_NAME',mapping:'PERSON_NAME'},
                        
                        {name:'DISPOSE_CONTENT',mapping:'DISPOSE_CONTENT'},
                        {name:'DISPOSE_TYPE',mapping:'DISPOSE_TYPE'},
                        {name:'INFO_TYPE_NAME',mapping:'INFO_TYPE_NAME'},
                        {name:'INVOLVE_CUST',mapping:'INVOLVE_CUST'},
                        {name:'ANTISTOP',mapping:'ANTISTOP'},
                        {name:'OPERATE_PERSON',mapping:'OPERATE_PERSON'},
                        {name:'OPERATE_PERSON_NAME',mapping:'OPERATE_PERSON_NAME'},
                        {name:'OPERATE_DATE',mapping:'OPERATE_DATE'},
                        {name:'REGISTER_CONTENT',mapping:'REGISTER_CONTENT'},
                        {name:'RESPONSES_DAY',mapping:'RESPONSES_DAY'}
                   ] 
            });
            stateGrid = new Ext.grid.GridPanel({
                    title:'处理流程',
                    region:'south',
                    autoScroll: true,
                    enableHdMenu : false,
                    height : document.body.clientHeight * 0.34,
                     width : 440,
                    store : stateStore,
                    border: true,
                    frame : false,
                    loadMask:{msg:"数据加载中,请稍等..."},
                    columns : [new Ext.grid.RowNumberer(),
                            {header : 'Id',dataIndex : 'INFO_REGISTER_ID',width:100,align:'left',hidden:true},
                            {header : '发送时间',dataIndex : 'SEND_DATE',width:70,align:'left'},
                            {header : '处理时间',dataIndex : 'DISPOSE_DATE',width:70,align:'left'},
                            {header : '类型',dataIndex : 'TYPE',width:70,align:'left'},
                            {header : '人员代码',dataIndex : 'PERSON_CODE',width:110,hidden:true},
                            {header : '人员',dataIndex : 'PERSON_NAME',width:110,align:'left'},
                            {header : '操作',dataIndex : 'TYPE',width:70,renderer: dealDetail,align:'left'}
                    ],
                    viewConfig : { width:500,autoScroll:true,forceFit : false}
            });
            //默认选中第一行
            stateGrid.store.on("load",function(){
                stateGrid.getSelectionModel().selectFirstRow();
                gridSpan(stateGrid,"row","","");
               });
        },
        
        initWin : function() {
            win = new Ext.Window({
                layout : 'form',
                modal : true,
//                closable : false,
//                draggable : false,
                title : '按接收部门',
                height : document.body.clientHeight * 0.9,
                width : document.body.clientWidth - 100,
                resizable : false,
                items : [mainGrid, stateGrid,
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "receive_dept_d"},
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "respon_dept_d"},
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "type_d"},
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "unitId_d"},
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "deptCode_d"},
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "operPersonCode_d"},
                        {labelWidth : 10,xtype: "hidden",layout: 'form',id: "yearMonth_d"}
]
            });
        win.show();
        win.center();
        }
    };
    
    function gridSpan(grid, rowOrCol, cols, sepCol) {
        var array1 = new Array();
        var arraySep = new Array();
        var count1 = 0;
        var count2 = 0;
        var index1 = 0;
         var index2 = 0;
         var aRow = undefined;
         var preValue = undefined;
         var firstSameCell = 0;
         var allRecs = grid.getStore().getRange();
         if (rowOrCol == "row") {
             count1 = grid.getColumnModel().getColumnCount();
             count2 = grid.getStore().getCount();
         } else {
             count1 = grid.getStore().getCount();
             count2 = grid.getColumnModel().getColumnCount();
         }
        for (i = 0; i < count1; i++) {
            if (rowOrCol == "row") {
                 var curColName = grid.getColumnModel().getDataIndex(i);
                 var curCol = "[" + curColName + "]";
                 if (cols.indexOf(curCol) < 0)
                 continue;
             }
             preValue = undefined;
             firstSameCell = 0;
             array1[i] = new Array();
             for (j = 0; j < count2; j++) {
                 if (rowOrCol == "row") {
                     index1 = j;
                     index2 = i;
                 } else {
                     index1 = i;
                     index2 = j;
                 }
                 var colName = grid.getColumnModel().getDataIndex(index2);
                 if (sepCol && colName == sepCol)
                 arraySep[index1] = allRecs[index1].get(sepCol);
                 var seqOldValue = seqCurValue = "1";
                 if (sepCol && index1 > 0) {
                     seqOldValue = arraySep[index1 - 1];
                     seqCurValue = arraySep[index1];
                 }
                if (allRecs[index1].get(colName) == preValue && (colName == sepCol || seqOldValue == seqCurValue)) {
                     //alert(colName + "======" + seqOldValue + "======" + seqCurValue);
                     allRecs[index1].set(colName, "&nbsp;");
                     array1[i].push(j);
                     if (j == count2 - 1) {
                         var index = firstSameCell + Math.round((j + 1 - firstSameCell) / 2 - 1);
                         if (rowOrCol == "row") {
                             allRecs[index].set(colName, preValue);
                           } else {
                               allRecs[index1].set(grid.getColumnModel().getColumnId(index), preValue);
                           }
                       }
                   } else {
                       if (j != 0) {
                           var index = firstSameCell + Math.round((j + 1 - firstSameCell) / 2 - 1);
                           if (rowOrCol == "row") {
                               allRecs[index].set(colName, preValue);
                           } else {
                               allRecs[index1].set(grid.getColumnModel().getColumnId(index), preValue);
                           }
                       }
                       firstSameCell = j;
                       preValue = allRecs[index1].get(colName);
                       allRecs[index1].set(colName, "&nbsp;");
                       if (j == count2 - 1) {
                           allRecs[index1].set(colName, preValue);
                       }
                   }
               }
           }
           grid.getStore().commitChanges();
           //添加所有分隔线
         var rCount = grid.getStore().getCount();
           for (i = 0; i < rCount; i ++) {
               for (j = 0; j < grid.getColumnModel().getColumnCount(); j ++) {
                   aRow = grid.getView().getCell(i,j);
                 if (i == 0) {
                     aRow.style.borderTop = "none";
                     aRow.style.borderLeft = "1px solid #ccc";
                 } else if (i == rCount - 1) {
                     aRow.style.borderTop = "1px solid #ccc";
                     aRow.style.borderLeft = "1px solid #ccc";
                     aRow.style.borderBottom = "1px solid #ccc";
                 } else {
                     aRow.style.borderTop = "1px solid #ccc";
                     aRow.style.borderLeft = "1px solid #ccc";
                 } if(j == grid.getColumnModel().getColumnCount()-1)
                     aRow.style.borderRight = "1px solid #ccc";
                   if(i == rCount-1)     
                     aRow.style.borderBottom = "1px solid #ccc";
                 //aRow.style.borderBottom = "1px solid #ccc";
               }
           }
           //去除合并的单元格的分隔线
           for (i = 0; i < array1.length; i++) {
               for (j = 0; j < array1[i].length; j++) {
                   if (rowOrCol == "row") {
                       aRow = grid.getView().getCell(array1[i][j],i);
                       aRow.style.borderTop = "none";
                   } else {
                       aRow = grid.getView().getCell(i, array1[i][j]);
                       aRow.style.borderLeft = "none";
                   }
               }
           }
    }
    
    // 查询
    function close() {
        win.close();
    }
}();

//Ext.onReady(Ext.acceptDept.main.init, Ext.acceptDept.main);

 

posted @ 2013-04-22 09:20  牧之丨  阅读(9217)  评论(0编辑  收藏  举报