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); ο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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九个Console命令,让js调试更简单

一、显示信息的命令 1: <!DOCTYPE html>2: <html>3: <head>4: <title>常用console命令</title>5: <meta http-equiv"Content-Type" content"text/html; charsetutf-8" />6: </head>7: <body>8: …

numpy——axis

size()和max()中的含义 以前我理解axis0代表行&#xff0c;axis1代表列&#xff1b; 但是这种含义在函数size()和max()中恰恰相反&#xff1b; 其实不是这样的&#xff0c;我们回到单词axis本身&#xff0c;它的意思是“轴”&#xff0c;没错轴就是代表一个方向&#xff0c;像…

Halcon例程(基于3D形状匹配识别方法)详解 —— create_shape_model_3d_lowest_model_level.hdev

一、例程简介 最近在研究3D识别方面的东西&#xff0c;查了不少资料&#xff0c;发现halcon里有不少关于三维物体识别的例程&#xff0c;这里对其中一个做出详解。该例程是基于三维匹配方法的&#xff0c;因为有三维模型SM3&#xff0c;所以不需要自己创建&#xff1b;另因为例…

15.瀑布流、测量

排行界面TopProtocol &#xff1a;json数据就是写字符串&#xff0c;所以不需要写bean对象public class TopProtocol extends BaseProtocol<List<String>> { Override public List<String> paserJson(String json) { List<String> datasnew ArrayList&…

linear-gradient线性渐变

background:linear-gradient(180deg, sliver 20%, skyblue 80%, gray 100%);180deg 是线性渐变的角度,水平方向;如果是90deg,则是垂直方向. silver 20% 是最上面的颜色和该颜色所在的位置,可以为负值,,如 linear-gradient(180deg, silver -7%, pink 80%, skyblue 127%);的效果是…

C# —— 简单工厂设计模式详述

一、基本概念 众所周知&#xff0c;C#是一种面向对象的语言&#xff0c;而其中封装&#xff0c;继承&#xff0c;多态是面向对象的三大重要特征&#xff0c;简单工厂的设计模式则可以完全体现这些特征。要彻底理解这个模式&#xff0c;必须要先将封装&#xff08;访问修饰符的…

工业相机常用类型详述

一、工业相机定义 工业相机是应用于工业领域、安防和交通等对相机要求较高领域的摄像机&#xff0c;功能就是将光信号转变成有序的电信号&#xff0c;此信号经过模数转换为数字信号&#xff0c;然后传递给图像处理器。与一般的家用相机相比&#xff0c;其具有更高的稳定性能&a…

机器学习——SVM之python实现数据样本标准化和归一化

目录 一、标准化和归一化的目的 1、标准化 2、归一化 二、标准化和归一化常用的理论公式 1、归一化 2、标准化 三、python实现SVM样本数据标准化和归一化 1、标准化 2、归一化 本文源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》 一、标准化…

[黑群晖经典教程] 一步一步建立自己的黑群晖

【申明&#xff1a;本文并非本人所作&#xff0c;为内部网络中一位大神所写&#xff0c;个人觉得写得很好&#xff0c;遂原文搬了过来&#xff0c;如有侵犯原作者的权利&#xff0c;请及时与我联系】 PS:有好几个兄弟觉得我擅自转发&#xff0c;不是很妥。解释一下&#xff1a;…

C++和Opencv4.5 实现全景图像拼接

前言 最近刚下了最新版的opencv4.5&#xff0c;急不可待的试下操作&#xff0c;就用了opencv自带的Stitcher类拼接下图像&#xff0c;结果傻眼了&#xff0c;程序显示Stitcher没有createDefault成员&#xff0c;看了好久&#xff0c;终于找到了解决方法。 Stitcher原理 Stit…

机器学习——python实现SVM模型w,b的查看

基于源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》进行讲解 1、线性模型 这里以二特征三类&#xff0c;一对多策略为案例 kernel “linear”&#xff1a;线性核&#xff0c;参数有w&#xff0c;b 线性模型的决策边界是&#xff1a;w0iTx0i w1i…

移动端输入框弹出键盘控制

在移动端&#xff0c;我们公司通过输入框主要收集用户的姓名和电话&#xff0c;以下是对输入框获取焦点时&#xff0c;控制弹出键盘的样式来增强用户体验。 输入姓名 我们的用户都是中国人&#xff0c;输入用户名为中文&#xff0c;所以弹出键盘是输入中文状态即可&#xff0c;…

相机标定(一) —— 深入理解齐次坐标及其作用

一、什么是齐次坐标和齐次坐标系 齐次坐标 齐次坐标是一个相机标定问题的关键理论之一&#xff0c;所以就此问题分析一下。 单从定义上来讲&#xff0c;齐次坐标&#xff08;投影坐标&#xff09;就是用N1维来代表N维坐标&#xff08;点和向量&#xff09;&#xff0c;也可说…

机器学习——图解SVM中gamma和c参数的作用

参数c和gamma的作用 我们通过下图详解参数c的作用&#xff0c;首先我们以一个简单的线性分类器为例&#xff0c;上一个博客中我们知道影响分类器的主要因素是支持向量&#xff0c;即虚线上的样本&#xff0c;如下图可知&#xff1a; 但当正负样本的分布在如下情况时&#xff0…

面试题(十四)

唐巧前辈说这些都是 iOS 的基础问题&#xff0c;应该对此深入的了解。当初看到时&#xff0c;大部分回答不上来&#xff0c;因为平时没有好好思考整理过。这里大部分的概念大多会在学习 OC 的过程中遇到过&#xff0c;但还是得经过写代码才能有更深的理解。反正我当初看那些设计…

工业相机基础知识详述 —— 焦平面,像平面,弥散圆,光圈,分辨率,景深,接口,靶面尺寸

一、焦平面 想到焦平面&#xff0c;很多人不由自主就想到不就是焦点所在的垂直于光轴的平面吗&#xff1f;其实其背后隐藏这更多的东西。 1&#xff09;焦点不止一个 对于一般拍摄场景来说&#xff0c;光通过一个凸透镜&#xff0c;汇聚不到一个点&#xff0c;越靠近中轴线的…

相机标定(二)深入理解四大坐标系与其变换关系

一、前言 视觉系统一共有四个坐标系&#xff1a;像素平面坐标系&#xff08;u,v&#xff09;、图像坐标系&#xff08;x,y&#xff09;、相机坐标系&#xff08;Xc,Yc,Zc&#xff09;和世界坐标系&#xff08;Xw,Yw,Zw&#xff09;&#xff0c;如下图所示。每种坐标系之间均存…

相机标定(三) —— 畸变校正

一、前言 根据针孔模型&#xff0c;物体和成像之间参数会满足相似三角形的关系。但现实中会存在装配误差和透视失真等原因&#xff0c;导致这种关系无法成立&#xff0c;使理想成像与实际成像存在误差&#xff0c;这种误差即称为畸变。 畸变分为径向畸变&#xff0c;切向畸变和…

SVG技术入门:线条动画实现原理

相信大家都见到过这样神奇的技术&#xff1a;一副线条构成的画能自动画出自己。非常的酷。Jake Archibald是这种SVG技术的首创者&#xff0c;并且写了一篇非常好的文章来描述它是如何实现的。Brian Suda也在24 Ways网站上讨论过它。 Polygon使用它在一篇设计方面的文章里创造出…

机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1&#xff09;待估参数&#xff1a; 2&#xff09;超参数&#xff1a; 3&#xff09;任务 3、神经网络数学模型定义 1&#xff09;激活函数 ​ 2&#xff09;各层权重、阈值定义 3&#xff09;各层输入输…