鸣谢网址: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); οnclick="+'points()'+"'>"+v+"</a>";  var str1 = "<a href='javascript:void(0); οnclick="+'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');//展开
        }});
});

转载于:https://www.cnblogs.com/wql025/p/4979663.html

ExtJS4.2学习(10)分组表格控件--GroupingGrid(转)相关推荐

  1. ExtJS4.2学习(10)分组表格控件--GroupingGrid

    分组表格控件在我们的开发中经常被用到,GroupingGrid分组表格就是在普通表格的基础上,根据某一列的数据显示表格中的数据分组的表格控件.举个例子给大家,比如某些信息用树形显示觉得有点大才小用,树 ...

  2. ExtJs 分组表格控件----监听

    ExtJs 分组表格控件----监听 2013年8月1日 10:59 如图,点击expand可以展开所有的分组,collapse可以合并所有的列,toggle和toggleone展开合并一个分组 Ex ...

  3. java propertygrid_ExtJS4.2学习(九)属性表格控件PropertyGrid

    PropertyGrid是在上节我们说的Editor的基础上开发的更灵活的高级表格组件,下面我们来看下它的功能和应用方式: 属性表格扩展自EditGrid,所以可以直接编辑右边的内容.注意,只有右边的 ...

  4. QT学习之TableWidget 表格控件使用

    1.创建一个UI的项目,拖拽一个Tablewidget 控件到主界面中,然后输入以下代码 #include "mainwindow.h" #include "ui_mai ...

  5. [转]ExtJS的使用方法汇总—配置和表格控件使用

    在网上差一些关于ExtJS的相关资料,看到这篇博客写的不错,拿出来分享一下! 博客文章:ExtJS的使用方法汇总(1)--配置和表格控件使用               ExtJS的使用方法汇总(2) ...

  6. c# 自定义甘特表格控件 (原创 学习中请指导)

    本人想做一个甘特表格控件,主要实现如下功能: 1.表头为相关任务列和显示日期类形式(分月.周.日.时), 2.内容以甘特图一样显示计划和进度相关信息,根据计划开工和结束日期.计划时长 和实际开工和结束 ...

  7. ESP32 开发笔记(四)LVGL控件学习 Table 表格控件

    先看效果,创建一个简单的表格 开发板购买链接https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft= ...

  8. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. SqlDependency 与 SignalR 实现Web页面的数据实时刷新
  2. 小K的农场(luogu P1993
  3. android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
  4. LoaderManager使用详解(一)---没有Loader之前的世界
  5. shell 本地接口自动化
  6. 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate
  7. python实现人脸识别比对_人脸识别并比对实现(基于face_recognition)
  8. 每位开发人员都应该阅读的优秀源代码,长啥样?
  9. Axure Share ——原型设计工具 Axure ,移动版
  10. 电脑分屏没有声音_电脑用HDMI线分屏后,耳机或音箱没声音之完美解决!
  11. python mysql library,python调用mysql报错解决方案
  12. 【洛谷P1228】地毯填补问题【分治】【递归】【DFS】
  13. WinXP/Win2003系统ISO镜像文件PE安装步骤
  14. 平行因子-三维荧光-PARAFAC数据前处理
  15. setprop service.adb.tcp.port 5555
  16. 计算任意多边形的面积
  17. 安卓恢复大师怎样恢复手机删除的照片
  18. 【算法岗求职笔记】降维 · 五问五答
  19. 移动支付的浪潮下,支付接入会遇到哪些难题?
  20. windows 安装 greenplum-loader

热门文章

  1. PAT_B_1002_Java(20分)
  2. scatter python_python数据可视化(matplotlib、scatter)
  3. 禁止服务器的协议,启用或禁用服务器网络协议
  4. oracle存储过程隐式函数,Oracle存储过程,函数。
  5. python跳转到新页面、如何等待页面加载完_python urllib2 – 在抓取之前等待页面完成加载/重定向?...
  6. 数学--数论---P4718 Pollard-Rho算法 大数分解
  7. CharNet算法详解
  8. 关系数据库SQL语言核心功能
  9. 一个法国摄影师在中国
  10. 使用CAtlRegExp正则表达式检查浮点数输入