博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ExtJs Grid 合计 [Ext | GridPanel | GridSummary]
阅读量:6414 次
发布时间:2019-06-23

本文共 7865 字,大约阅读时间需要 26 分钟。

 1.      截图效果

      

      2.      修改源代码 ext-3.0-rc1\source\data\JsonReader.js,添加汇总接受数据的属性,注意代码红色部分。

            2.1      添加属性,this.dataSum = 0,源码97行后:

Ext.data.JsonReader 
=
 
function
(meta, recordType){
    meta 
=
 meta 
||
 {};
    
this.dataSum = 0;//add
    Ext.data.JsonReader.superclass.constructor.call(
this
, meta, recordType 
||
 meta.fields);
};

            2.1      为属性赋值,源码180 行左右,红色部分。

        
if
 (
!
this
.ef) {
            
//
 over 2009-5-3
            if(s.dataSum){
                this.dataSum = o.dataSum;
            }
            
if
(s.totalProperty) {
                
this
.getTotal 
=
 
this
.getJsonAccessor(s.totalProperty);
            }

      2.      实现统计功能的 GroupSummary.js,本代码来源于 。这里没有用自带例子里面的GroupSummary.js,因为在我这边报错。

Ext.ns(
'
Ext.ux.grid
'
);
Ext.ux.grid.GridSummary 
=
 
function
(config) {
        Ext.apply(
this
, config);
};
Ext.extend(Ext.ux.grid.GridSummary, Ext.util.Observable, {
    init : 
function
(grid) {
        
this
.grid 
=
 grid;
        
this
.cm 
=
 grid.getColumnModel();
        
this
.view 
=
 grid.getView();
        
var
 v 
=
 
this
.view;
        
//
 override GridView's onLayout() method
        v.onLayout 
=
 
this
.onLayout;
        v.afterMethod(
'
render
'
this
.refreshSummary, 
this
);
        v.afterMethod(
'
refresh
'
this
.refreshSummary, 
this
);
        v.afterMethod(
'
syncScroll
'
this
.syncSummaryScroll, 
this
);
        v.afterMethod(
'
onColumnWidthUpdated
'
this
.doWidth, 
this
);
        v.afterMethod(
'
onAllColumnWidthsUpdated
'
this
.doAllWidths, 
this
);
        v.afterMethod(
'
onColumnHiddenUpdated
'
this
.doHidden, 
this
);
        
//
 update summary row on store's add/remove/clear/update events
        grid.store.on({
            add: 
this
.refreshSummary,
            remove: 
this
.refreshSummary,
            clear: 
this
.refreshSummary,
            update: 
this
.refreshSummary,
            scope: 
this
        });
        
if
 (
!
this
.rowTpl) {
            
this
.rowTpl 
=
 
new
 Ext.Template(
                
'
<div class="x-grid3-summary-row x-grid3-gridsummary-row-offset">
'
,
                    
'
<table class="x-grid3-summary-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">
'
,
                        
'
<tbody><tr>{cells}</tr></tbody>
'
,
                    
'
</table>
'
,
                
'
</div>
'
            );
            
this
.rowTpl.disableFormats 
=
 
true
;
        }
        
this
.rowTpl.compile();
        
if
 (
!
this
.cellTpl) {
            
this
.cellTpl 
=
 
new
 Ext.Template(
                
'
<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} {css}" style="{style}">
'
,
                    
'
<div class="x-grid3-cell-inner x-grid3-col-{id}" unselectable="on" {attr}>{value}</div>
'
,
                
"
</td>
"
            );
            
this
.cellTpl.disableFormats 
=
 
true
;
        }
        
this
.cellTpl.compile();
    },
    calculate : 
function
(rs, cm) {
        
var
 data 
=
 {}, cfg 
=
 cm.config;
        
for
 (
var
 i 
=
 
0
, len 
=
 cfg.length; i 
<
 len; i
++
) { 
//
 loop through all columns in ColumnModel
            
var
 cf 
=
 cfg[i], 
//
 get column's configuration
                cname 
=
 cf.dataIndex; 
//
 get column dataIndex
            
//
 initialise grid summary row data for
            
//
 the current column being worked on
            data[cname] 
=
 
0
;
            
if
 (cf.summaryType) {
                
for
 (
var
 j 
=
 
0
, jlen 
=
 rs.length; j 
<
 jlen; j
++
) {
                    
var
 r 
=
 rs[j]; 
//
 get a single Record
                    data[cname] 
=
 Ext.ux.grid.GridSummary.Calculations[cf.summaryType](r.get(cname), r, cname, data, j);
                }
            }
        }
        
return
 data;
    },
    onLayout : 
function
(vw, vh) {
        
if
 (Ext.type(vh) 
!=
 
'
number
'
) { 
//
 handles grid's height:'auto' config
            
return
;
        }
        
//
 note: this method is scoped to the GridView
        
if
 (
!
this
.grid.getGridEl().hasClass(
'
x-grid-hide-gridsummary
'
)) {
            
//
 readjust gridview's height only if grid summary row is visible
            
this
.scroller.setHeight(vh 
-
 
this
.summary.getHeight());
        }
    },
    syncSummaryScroll : 
function
() {
        
var
 mb 
=
 
this
.view.scroller.dom;
        
this
.view.summaryWrap.dom.scrollLeft 
=
 mb.scrollLeft;
        
this
.view.summaryWrap.dom.scrollLeft 
=
 mb.scrollLeft; 
//
 second time for IE (1/2 time first fails, other browsers ignore)
    },
    doWidth : 
function
(col, w, tw) {
        
var
 s 
=
 
this
.view.summary.dom;
        s.firstChild.style.width 
=
 tw;
        s.firstChild.rows[
0
].childNodes[col].style.width 
=
 w;
    },
    doAllWidths : 
function
(ws, tw) {
        
var
 s 
=
 
this
.view.summary.dom, wlen 
=
 ws.length;
        s.firstChild.style.width 
=
 tw;
        
var
 cells 
=
 s.firstChild.rows[
0
].childNodes;
        
for
 (
var
 j 
=
 
0
; j 
<
 wlen; j
++
) {
            cells[j].style.width 
=
 ws[j];
        }
    },
    doHidden : 
function
(col, hidden, tw) {
        
var
 s 
=
 
this
.view.summary.dom,
            display 
=
 hidden 
?
 
'
none
'
 : 
''
;
        s.firstChild.style.width 
=
 tw;
        s.firstChild.rows[
0
].childNodes[col].style.display 
=
 display;
    },
    renderSummary : 
function
(o, cs, cm) {
        cs 
=
 cs 
||
 
this
.view.getColumnData();
        
var
 cfg 
=
 cm.config,
            buf 
=
 [],
            last 
=
 cs.length 
-
 
1
;
        
for
 (
var
 i 
=
 
0
, len 
=
 cs.length; i 
<
 len; i
++
) {
            
var
 c 
=
 cs[i], cf 
=
 cfg[i], p 
=
 {};
            p.id 
=
 c.id;
            p.style 
=
 c.style;
            p.css 
=
 i 
==
 
0
 
?
 
'
x-grid3-cell-first 
'
 : (i 
==
 last 
?
 
'
x-grid3-cell-last 
'
 : 
''
);
            
if
 (cf.summaryType 
||
 cf.summaryRenderer) {
                p.value 
=
 (cf.summaryRenderer 
||
 c.renderer)(o.data[c.name], p, o);
            } 
else
 {
                p.value 
=
 
''
;
            }
            
//
此处设置默认不显示时用什么符号标记
            
if
 (p.value 
==
 undefined 
||
 p.value 
===
 
""
) p.value 
=
 
"
-
"
;
            buf[buf.length] 
=
 
this
.cellTpl.apply(p);
        }
        
return
 
this
.rowTpl.apply({
            tstyle: 
'
width:
'
 
+
 
this
.view.getTotalWidth() 
+
 
'
;
'
,
            cells: buf.join(
''
)
        });
    },
    refreshSummary : 
function
() {
        
var
 g 
=
 
this
.grid, ds 
=
 g.store,
            cs 
=
 
this
.view.getColumnData(),
            cm 
=
 
this
.cm,
            rs 
=
 ds.getRange(),
            data 
=
 
this
.calculate(rs, cm),
            buf 
=
 
this
.renderSummary({data: data}, cs, cm);
        
if
 (
!
this
.view.summaryWrap) {
            
this
.view.summaryWrap 
=
 Ext.DomHelper.insertAfter(
this
.view.scroller, {
                tag: 
'
div
'
,
                cls: 
'
x-grid3-gridsummary-row-inner
'
            }, 
true
);
        }
        
this
.view.summary 
=
 
this
.view.summaryWrap.update(buf).first();
    },
    toggleSummary : 
function
(visible) { 
//
 true to display summary row
        
var
 el 
=
 
this
.grid.getGridEl();
        
if
 (el) {
            
if
 (visible 
===
 undefined) {
                visible 
=
 el.hasClass(
'
x-grid-hide-gridsummary
'
);
            }
            el[visible 
?
 
'
removeClass
'
 : 
'
addClass
'
](
'
x-grid-hide-gridsummary
'
);
            
this
.view.layout(); 
//
 readjust gridview height
        }
    },
    getSummaryNode : 
function
() {
        
return
 
this
.view.summary
    }
});
Ext.reg(
'
gridsummary
'
, Ext.ux.grid.GridSummary);
/*
 * all Calculation methods are called on each Record in the Store
 * with the following 5 parameters:
 *
 * v - cell value
 * record - reference to the current Record
 * colName - column name (i.e. the ColumnModel's dataIndex)
 * data - the cumulative data for the current column + summaryType up to the current Record
 * rowIdx - current row index
 
*/
Ext.ux.grid.GridSummary.Calculations 
=
 {
    sum : 
function
(v, record, colName, data, rowIdx) {
        
return
 data[colName] 
+
 Ext.num(v, 
0
);
    },
    count : 
function
(v, record, colName, data, rowIdx) {
        
return
 rowIdx 
+
 
1
;
    },
    max : 
function
(v, record, colName, data, rowIdx) {
        
return
 Math.max(Ext.num(v, 
0
), data[colName]);
    },
    min : 
function
(v, record, colName, data, rowIdx) {
        
return
 Math.min(Ext.num(v, 
0
), data[colName]);
    },
    average : 
function
(v, record, colName, data, rowIdx) {
        
var
 t 
=
 data[colName] 
+
 Ext.num(v, 
0
), count 
=
 record.store.getCount();
        
return
 rowIdx 
==
 count 
-
 
1
 
?
 (t 
/
 count) : t;
    }
}

      3.      调用代码

            3.1      改后的JsonReader调用方法:

    
var
 jr 
=
 
new
 Ext.data.JsonReader({
            totalProperty: 
'
count
'
,
            root: 
'
result
'
,
            dataSum: 
'
dataSum
'
      
//
注意了,这个是我自定义的属性(成员变量)
        },[
            { name: 
'
fgsname
'
 },
            { name: 
'
dianname
'
},
            { name: 
'
asd
'
 },
            { name: 
'
Money
'
,type: 
'
float
'
}
    ]);

            3.2      为GridPanel添加插件

    
var
 summary 
=
 
new
 Ext.ux.grid.GridSummary();
    
    
var
 grid 
=
 
new
 Ext.grid.GridPanel({
    
        plugins: summary,
        
        
//

            3.3      修改ColumnModel

    
var
 renderSummary 
=
 
function
(o, cs, cm) {
        
return
 
'
合计:
'
+
jr.dataSum;
    }
    
    
var
 dataColumns 
=
 
new
 Ext.grid.ColumnModel([
        {header: 
"
编  号
"
, align:
'
center
'
, dataIndex: 
'
asd
'
},
        {header: 
"
分公司
"
, align:
'
center
'
, dataIndex: 
'
fgsname
'
,locked: 
true
},
        {header: 
"
店  面
"
, align:
'
center
'
, dataIndex: 
'
dianname
'
},
        {header: 
"
余  额
"
, align:
'
center
'
, dataIndex: 
'
Money
'
,summaryRenderer:renderSummary}
    ]);

      4.      代码下载:

更新

      1.      2009-5-6      请在我修改后的JsonReader.js大概210行左右加上如下标红代码:

        
var
 root 
=
 
this
.getRoot(o), c 
=
 root.length, totalRecords 
=
 c, success 
=
 
true
;
        
//
add 
        
if(s.dataSum){
                this.dataSum = o.dataSum;
        }
        
if
(s.totalProperty){
            
var
 v 
=
 parseInt(
this
.getTotal(o), 
10
);
            
if
(
!
isNaN(v)){
                totalRecords 
=
 v;
            }
        }

      2.      2009-5-13      如果在同一页面不是通过刷新来搜索的,可能会出现没有搜索结果而表格的数据确没有清掉统计也是上次搜索的结果,需要在搜索前加上如下三行代码就可以了:

    grid.store.removeAll();
    jr.dataSum 
=
 
0
;
    summary.refreshSummary();

 本文转自博客园农民伯伯的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
vue-router
查看>>
洛谷P1962 斐波那契数列
查看>>
题解——HDU 4734 F(x) (数位DP)
查看>>
[转]35 岁前程序员要规划好的四件事
查看>>
大话F#和C#:是否会重蹈C#失败的覆辙?
查看>>
jQuery常用方法
查看>>
经典算法
查看>>
11 用户交互,显示省市县三级联动的选择
查看>>
sql语句的优化分析
查看>>
运维面试题五十题
查看>>
雷神编码博客入口
查看>>
当通过Struts2传值给后台时,如果是外键,传字符串那么会出现错误
查看>>
主流浏览器
查看>>
String类replaceAll方法正则替换深入分析
查看>>
快速排序
查看>>
极限编程和JUnit
查看>>
linux上部署ant
查看>>
arc073 F many moves(dp + 线段树)
查看>>
长理 校赛的 一个贪心题
查看>>
vuecli3初尝试(转载)
查看>>