ExtJS4.2学习(10)分组表格控件--GroupingGrid(转)
鸣谢网址:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-17/179.html
---------------------------------------------------------------------------------------------
分组表格控件在我们的开发中经常被用到,GroupingGrid分组表格就是在普通表格的基础上,根据某一列的数据显示表格中的数据分组的表格控件。举个例子给大家,比如某些信息用树形显示觉得有点大才小用,树形可以有无限极,但是用了分组表格可以完美的展示信息,看下图是我的项目中用到的一个例子,将所有评分项显示出来,并且动态获取是否有次数,如果有次数将出现可编辑,没有次数就不可编辑,如果需要扣分就出现链接,没有就不出现,这正好结合了我们前几节学的知识,看下面的图:

具体代码:我这里是在其他组件中弹出的这个分组表格控件,所以大家看重点代码即可,当时写这个功能可花费了不少时间,大家好好研究哈~
/**
* Grid
*/
actions.push(
{
text: '评分',
iconCls: 'gradebtn',
listeners: {
'click' : function() {
var xg = Ext.grid; var store = new Ext.data.GroupingStore({
autoLoad:true,
reader: new Ext.data.JsonReader({
root: 'data',
totalProperty: 'total',
remoteSort: true
},
[
{name:'groupid'},
{name:'groupname'},
{name:'itemid'},
{name:'itemgroupid'},
{name:'itemname'},
{name:'itemvalue'},
{name:'isnumber'},
{name:'status',type:'boolean'},
{name: 'desc'}
]),
proxy: new Ext.data.HttpProxy({
url: window.webRoot + 'rest/qaitem/',
method: 'GET'
}),
sortInfo:{field: 'itemname', direction: "ASC"},
groupField:'groupname'
});
var sm = new Ext.grid.CheckboxSelectionModel();
/** 设置次数
setNumber = function(v){
console.info(v);
var record = sm.getSelected();
record.set('isNumber',v);
}
*/
var grid = new xg.EditorGridPanel({
store: store,
clicksToEdit: 1,
stripeRows:true,
sm: sm,
listeners: {
beforeedit: function(e) {
if (e.record.get("isnumber") == "NO") {
return false;
}else{
return true;
}
}
},
columns: [
{id:'itemname',header: "选项组名称", width: 270, sortable: true, dataIndex: 'itemname'},
{header: "次数", width: 30, sortable: true, dataIndex: 'isnumber',
editor: new Ext.form.NumberField(),
renderer: function(v,m,r){
return v;
/*
if(v =="YES"){
var showv = (r.data.isnumber=="YES"?'' : r.data.isNumber);
return r.data.isNumber;//"<input type='text' value = '"+showv+"' size='7' onkeyup ='setNumber(this.value)' />";
}else if(v=="NO"){
return "不存在次数";
}else{
return "数据读取失败";
}
*/
}
},
{dataIndex: 'groupid',hidden:true},
{dataIndex: 'itemid',hidden:true},
{dataIndex: 'itemgroupid',hidden:true},
{dataIndex:'status',hidden:true},
{header:'分值', width:20, sortable:true, dataIndex: 'itemvalue',
renderer: function(v,m,r){
// m.css='x-grid-bak-blue';
var str = "<a href='javascript:void(0); onclick="+'points()'+"'>"+v+"</a>";
var str1 = "<a href='javascript:void(0); onclick="+'points(true)'+"'>取消</a>";
if(r.data.isnumber != "NO" ){
return v;
}
return !r.data.status?str : str1;
}
},
{header: "评分选项组", width: 30, sortable: true, dataIndex: 'groupname'}
],
view: new Ext.grid.GroupingView({
forceFit:true,
groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "项" : "个"]})'
}),
frame:true,
loadMask:true,
layout: 'fit',
width: 950,
height: 450
}); points = function(is){
var r = sm.getSelected();
if(r.data.isnumber != "NO"){
//转换成int操作 次数和是否扣分了 }
r.set('fenshu', r.data.itemvalue);
r.set('status',!is);
r.commit();
} var win = new Ext.Window({
title:'质检评分',
width:955,
height:515,
region:'center',
iconCls: 'gradebtn',
layout: 'fit',
resizable:true,
modal:true,
closeAction:'hide',
items:[grid],
buttons:[{
text:'保存',
listeners : {
'click' : function() {
var fenshu = '',itemname ='';
var status = '',itemgroupid ='';
var isNumber = '',itemid='';
var groupid = '',grouptypeid='',groupname='';
for (var i = 0; i<store.data.items.length; i++) {
var rco = store.getAt(i);
if(i==store.data.items.length-1){
fenshu +=rco.get('itemvalue');
status += rco.get('status');
groupid += rco.get('groupid');
groupname += rco.get('groupname');
itemid += rco.get('itemid');
itemgroupid += rco.get('itemgroupid');
itemname += rco.get('itemname');
if(rco.get('isnumber')=='YES'||rco.get('isnumber')=='NO'||rco.get('isnumber')==''){
isNumber += '0';
}else{
isNumber += rco.get('isnumber')+'';
}
}else{
fenshu +=rco.get('itemvalue')+',';
status += rco.get('status')+',';
groupid += rco.get('groupid')+',';
groupname += rco.get('groupname')+',';
itemid += rco.get('itemid')+',';
itemgroupid += rco.get('itemgroupid')+',';
itemname += rco.get('itemname')+',';
if(rco.get('isnumber')=='YES'||rco.get('isnumber')=='NO'||rco.get('isnumber')==''){
isNumber += '0,';
}else{
isNumber += rco.get('isnumber')+',';
}
}
}
Ext.Ajax.request({
url : window.webRoot + 'rest/qaitemscore/',
params: {
userId:'<%=userId%>',
recordId:rec.get('id'),
ani:rec.get('ani'),
dnis:rec.get('dnis'),
callType:rec.get('callType'),
begintime:formatDateTime(rec.get('beginTime')),
endtime:formatDateTime(rec.get('endTime')),
length:rec.get('callTime'),
extno:rec.get('extNo'),
fileName:rec.get('fileName'),
agentNo:rec.get('agentNo'),
itemvalue: fenshu,
status: status,
isNumber: isNumber,
groupid: groupid,
grouptypeid: grouptypeid,
groupname: groupname,
itemid: itemid,
itemgroupid: itemgroupid,
itemname: itemname,
callId: rec.get('callId'),
assigenederid: rec.get('assigeneder')
},
success: function(res) {
myMask.hide();
var respText = Ext.decode(res.responseText);
if(respText.code == 'OK') {
Ext.Msg.alert('系统提示', '评分成功');
close();
} else {
Ext.Msg.alert('保存失败', respText.message + "(" + respText.code + ")");
}
},
failure: function(res) {
myMask.hide();
var respText = Ext.decode(res.responseText);
Ext.Msg.alert('保存失败', respText.message + "(" + respText.code + ")");
},
method: 'POST'
});
}
}
},{
text:'取消',
listeners : {
'click' : function() {
close();
}
}
}]
}).show();
var close=function(){
win.hide();
}
}
}
}
);
上面的是不是觉得有点复杂了?额。。我的错,下面来看个简单的:

这个就简单许多啦,看下主要代码,相信聪明的你一定能明白:
/**
* Grid
* 此js演示了ExtJS之分组表格--GroupingGrid
*/
//表格数据最起码有列、数据、转换原始数据这3项
Ext.onReady(function(){
var columns = [
{header:'编号',dataIndex:'id'},
{header:'性别',dataIndex:'sex'},
{header:'名称',dataIndex:'name'},
{header:'描述',dataIndex:'descn'}
];
var data = [
['1','male','name1','descn1'],
['2','female','name2','descn2'],
['3','male','name3','descn3'],
['4','female','name4','descn4'],
['5','male','name5','descn5']
]; var store = new Ext.data.ArrayStore({
fields:[
{name:'id'},
{name:'sex'},
{name:'name'},
{name:'descn'}
],
data:data,
groupField:'sex', //确定哪一项分组
sorter:[{property:'id', //排序属性
direction:'ASC'} //排序方式
]
}); var grid = new Ext.grid.GridPanel({
width:300,
autoHeight:true,
store:store,
columns:columns,
features:[{ftype:'grouping'}],
renderTo:'grid',
forceFit:true
});
});
这里的fields和data还是原来的示例一样,主要关注的是groupField,它确定通过哪一项进行分组。store可以设置sorter参数,这个参数对应的值有2项:property是排序的属性,direction是排序的方式。我们把数据传入,输出显示的就是分成一组一组的数据。但是,如果想显示成我们期待的那种形式,还需要设置feature为grouping
另外,分组表格控件的视图是有特殊功效的,通过它可以实现分组表格专用的对应功能,如下代码所示:
html代码:
<button id="expand">expand</button>
<button id="collapse">collapse</button>
<button id="one">toggle one</button>
<div id="grid"></div>
js代码:
//分组表格视图
Ext.get('expand').on('click',function(){
grid.view.features[0].expandAll();//grid.view.features[0]:返回grid的第一个features(当前的grid只有一个)
});
Ext.get('collapse').on('click',function(){
grid.view.features[0].collapseAll();
});
Ext.get('one').on('click', function() {
var feature = grid.view.features[0];
if (feature.isExpanded('female')) {//如果female节点是展开的,返回true
// feature.expand('female');//展开
feature.collapse('female');//闭合
} else {
// feature.collapse('female');//闭合
feature.expand('female');//展开
}
});
当然实现上面的代码功能必须要有3个button了,每个id设置对应的点击事件,上例中expandAll()展示所有分组,collapseAll()折叠所有分组。如果想自动判断分组的状态进行对应的折叠或展开操作---当分组都已折叠时执行展开所有分组,当分组都已展开时执行折叠所有分组,这就需要我们自己写代码来判断分组的状态了。这部分还存在着一个初始化的小问题,每次虽然分组显示的都是展开,但是feature.isExpanded()返回的都是false,所以要重复调用collapse()和expand()两个函数,才能实现正常切换。
(经测试这句话是有误的)。
下面是全部的js代码:
/**
* Grid
* 此js演示了ExtJS之分组表格--GroupingGrid
*/
//表格数据最起码有列、数据、转换原始数据这3项
Ext.onReady(function(){
var columns = [
{header:'编号',dataIndex:'id'},
{header:'性别',dataIndex:'sex'},
{header:'名称',dataIndex:'name'},
{header:'描述',dataIndex:'descn'}
];
var data = [
['1','male','name1','descn1'],
['2','female','name2','descn2'],
['3','male','name3','descn3'],
['4','female','name4','descn4'],
['5','male','name5','descn5']
]; var store = new Ext.data.ArrayStore({
fields:[
{name:'id'},
{name:'sex'},
{name:'name'},
{name:'descn'}
],
data:data,
groupField:'sex', //确定哪一项分组
sorter:[{property:'id', //排序属性
direction:'ASC'} //排序方式
]
}); var grid = new Ext.grid.GridPanel({
width:300,
autoHeight:true,
store:store,
columns:columns,
features:[{ftype:'grouping'}],
renderTo:'grid',
forceFit:true
});
//分组表格视图
Ext.get('expand').on('click',function(){
grid.view.features[0].expandAll();//grid.view.features[0]:返回grid的第一个features(当前的grid只有一个)
});
Ext.get('collapse').on('click',function(){
grid.view.features[0].collapseAll();
});
Ext.get('one').on('click', function() {
var feature = grid.view.features[0];
if (feature.isExpanded('female')) {//如果female节点是展开的,返回true
// feature.expand('female');//展开
feature.collapse('female');//闭合
} else {
// feature.collapse('female');//闭合
feature.expand('female');//展开
}
});
});
ExtJS4.2学习(10)分组表格控件--GroupingGrid(转)的更多相关文章
- ExtJS4.2学习(九)属性表格控件PropertyGrid(转)
鸣谢网址:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-15/178.html ------------- ...
- 深入浅出ExtJS 第三章 表格控件
3.1 表格的特性简介 >.Ext中的表格功能:包括排序/缓存/拖动/隐藏某一列/自动显示行号/列汇总/单元格编辑等实用功能; >.表格由类Ext.grid.GridPanel定义,继承自 ...
- Ext入门学习系列(五)表格控件(1)
上节学习了Ext面板控件,为后面的各个控件学习奠定基础,在此基础上本章将学习网络开发最期待的功能——表格控件. 我们都知道网络编程语言中,除了.net其他的基本没有提供网格控件,而最近的asp.net ...
- Ext入门学习系列(五)表格控件(3)
上节学习了Ext中如何绑定服务器端传递的数据.分别用asp.net和asp.net MVC.PHP.XML为例.本节主要介绍绑定之后的分页功能. 一.Ext的表格控件如何绑定? 分页是Ext自带的一个 ...
- Ext入门学习系列(五)表格控件(2)
上节学习了Ext中表格控件,从创建,到定义数据源.绑定显示,大体明白了一个基本的表格控件是怎么实现的.而我们用表格控件多用于从各种数据源接收数据并显示出来,并不是写死的.本章我们就不同数据源的不同实现 ...
- 12款 JavaScript 表格控件(DataGrid)
JavaScript 表格控件可以操作大数据集的 HTML表格,提供各种功能,如分页.排序.过滤以及行编辑.在本文中,我们整理了13个最好的 JavaScript 表格插件分享给开发人员,开发者可以很 ...
- tbl.js div实现的表格控件,完全免费,no jquery
html上现在有比较好用的表格控件是datatable,但是编辑.按钮等部分是收费的,只有基础功能免费.而且尺寸发生变化时需要手工刷新等繁琐操作较多.所以我开发一个免费的供大家使用. 本项目已用于“虚 ...
- tbl.js div实现的表格控件,完全免费,不依赖jquery
html上现在有比较好用的表格控件是datatable,但是编辑.按钮等部分是收费的,只有基础功能免费.而且尺寸发生变化时需要手工刷新等繁琐操作较多.所以我开发一个免费的供大家使用. 本项目已用于&q ...
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...
随机推荐
- Lombok(1.14.8) - @NoArgsConstructor, @RequiredArgsConstructor & @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor,提供一个无参的构造方法. package com.huey.hello.bean; import java.util.Dat ...
- 学习Learn Python The Hard Way 前言中的一段话,可与君共勉
在你通过这本书学习编程时,我正在学习弹吉他.我每天至少训练 2 小时,至少花一个小时练习音阶.和声.和琶音,剩下的时间用来学习音乐理论和歌曲演奏以及训练听力等.有时我一天会花 8 个小时来练习,因为我 ...
- JAVA生成EXCEL图表
跟据客户的要求,需要开发一套包括图形的报表,还需要导出WORD 图表需要这样: 这样: 这样: 还有这样: 接下来是实现思路: 以往用的最多的就是JFreechart,手上也有实现各种图形的资源,但是 ...
- Unity3D项目实战笔记(5):延时功能的几种实现
我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...
- C#调用dll时的类型转换总结
C++(Win 32) C# char** 作为输入参数转为char[],通过Encoding类对这个string[]进行编码后得到的一个char[] 作为输出参数转为byte[],通过Encodin ...
- [WCF]IIS部署到新系统
最近为以前的一个企业部署软件的时候,接触到WCF,通过博客园大佬的系列文章和一些书籍,基本了解了一些.简单说也算是SOA一种方式,提供某种服务,可以理解为一个类库,供其他项目使用,可以做到业务分离.但 ...
- jQuery实现列表自动滚动
需要在页面中一个小的区域循环滚动展示新闻(公告.活动.图片等等),并且,鼠标悬停时停止滚动并提示,离开后,继续滚动. 效果图: 上干货 html: <div id="news&q ...
- URAL 1024 Permutations(LCM)
题意:已知,可得出 P(1) = 4, P(2) = 1, P(3) = 5,由此可得出 P(P(1)) = P(4) = 2. And P(P(3)) = P(5) = 3,因此.经过k次如上变换, ...
- 《java编程思想》--多线程基础--Runnable
一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...
- xamarin android——数据绑定到控件(三)
如果当前活动中,只存在一个listview视图,可以借助ListActivity快速的实现一个列表,即当前Activity继承ListActivity.在OnCreate方法中简单的两行代码,就可以创 ...