FLEX4中使用Advanceddatagrid合计行怎么对列进行合计

Flex AdvancedDataGrid 动态构建和编辑并计算 - Wilson - ITeye技术网站
博客分类:
  项目实在太紧,多线程模块SIT还没结束,一堆前台的问题也得亲自上阵,马不停蹄加班加点到这一刻终于收工,趁热记录下遇到过的两个纠结的功能。今天先写第一个: 
关于flex动态AdvancedDataGrid的操作,前台根据后台返回数据构建一个动态的grid不算纠结,就略去,要说的是动态的可以编辑某些单元格,不是所有单元格都能编辑,只是一小部分。一旦单元格编辑完毕,有些依赖的格子就得做相应的计算,改变其值。举个例子吧:
 如上图是一个Flex的AdvancedDataGrid,后台返回有两批记录,每批记录都构建一列。现在每一列的第三行(也就是Revenue对应的行)的数字是可以改变的,而其他行不能改变,当某一列的第三行数字改变以后,该列所在的其他部分行的值就要相应改变,比如第五行的值=第三行的值 - 第四行的值;第一行的值 = 第三行的值/第六行的值,等等。
  貌似很简单,edit功能只要指定editable就可以,计算么可以在修改完之后去根据AdvancedDataGrid 获取指定的单元格然后设置其值就ok,嘿嘿,我开始也是这么想的。可惜,首先AdvancedDataGrid没有cell的概念,所以想要通过AdvancedDataGrid去获得单元格是困难的;其次这个AdvancedDataGrid是动态构建的,而且这个editable属性无法加到特定的格子里,要么整列,要么整个grid。肿么办?
  查了下api,好在AdvancedDataGrid有edit相关的事件onItemEditBegin、onItemEditEnd等。看来可以从这里做文章,对的,可以在onItemEditBegin事件中终止edit事件,这样就可以控制到具体的单元格了。
private function onItemEditBegin(event:AdvancedDataGridEvent):void{
if( model.riskAppetitleCol != null && model.riskAppetitleCol.length & 0){
if( event.columnIndex == 0 )
event.preventDefault();
else if(event.rowIndex != 3)
event.preventDefault();
  这里用event.dataField作为判断依据比较好,因为如果前台需要对grid排序的话,rowIndex会打乱,在这里就图简单直接用rowIndex和columnIndex做依据了。
这样在edit事件触发的时候,如果是第一列或者不是第三行,事件会被终止:  
event.preventDefault();
接下来看编辑完以后计算的问题。计算之前必然是先要能够取得user输入的新值,这个容易,在onItemEditEnd事件中通过AdvancedDataGrid对象的itemEditorInstanc属性很容易获取。那如果获取非当前edit的cell的值呢?计算以后的值如何设置给正确的cell呢?
既然无法通过AdvancedDataGrid获取类似cell,那很容易让人想到的通过他的dataProvider属性。没错,AdvancedDataGrid的dataProvider可以通过转化为类型ListCollectionView,从而通过rowIndex获取某一行的值对象,再通过dataField获取对应列的值,这样就能获取任意格子的值了。同理,计算好的值也可以通过他设置给需要的格子。例如:
//获取当前编辑格子的的值
ListCollectionView(advancedDataGrid.dataProvider).getItemAt(event.rowIndex)[event.dataField];
//获取第i行,以dataField为列头的格子的值
ListCollectionView(appetiteDataGrid.dataProvider).getItemAt(i)[dataField];
//设置第8行以dataField为列头的格子的值 = newCalVal
ListCollectionView(appetiteDataGrid.dataProvider).getItemAt(8)[dataField] = newCalV
没错,这样确实能达到准确获取数据,并计算好准确的设置给grid的dataProvider,按理dataProvider改变了,grid自然就达到显示效果了。但是调式中却发现,值的获取、计算都没问题,计算的新值也确实反映到grid的dataProvider中了,grid的dataProvider的绑定数据集也是正确的,但是页面上的grid显示值就是不改变!悲摧中,发现通过这样赋值是可以改变页面显示的:TextInput(advancedDataGrid.itemEditorInstance).text = initV但是这只能修改当前编辑的格子的值,远远不够啊!于是我尝试在onItemEditEnd中做了这样一件事情:当计算出新值后,我重新指定grid的dataProvider对象:
var newCol:ArrayCollection = new ArrayCollection(ObjectUtils.copy(advancedDataGrid.dataProvider.source) as Array); do something new to set new values for the newC advancedDataGrid.dataProvider = newC
调试中发现更悲剧的问题:当在onItemEditEnd事件中执行上面最后一行即重新设置dataProvider对象时,死循环发生了!advancedDataGrid.dataProvider = newCol会使得advancedDataGrid重新执行onItemEditEnd事件,而事件中又设置....! 这个问题有点tricky,在api上也没有相关的说明啊。
一筹莫展,但是相信flex肯定是有方法可以做到的,要不也太恶心而来吧。既然onItemEditEnd中会死循环,设置新值以后页面表格显示也不会刷新,显然不能在这个事件中做这些事情呗!对,编辑完了以后,可以在当前格子失去焦点的时候做这些事情啊!马上测试,在事件onItemFocusOut随便设置了下ListCollectionView(appetiteDataGrid.dataProvider).getItemAt(2)[dataField]=111; 页面生效!有戏啊!下面的工作就顺利多了:在onItemEditEnd中记录当前修改的格子对应的dataField(因为在onItemFocusOut无法获取),并把user新修改的值设置到advancedDataGrid的dataProvider(这在前面悲剧的尝试中发现是可行的),然后在onItemFocusOut事件中可以拿到最新的dataProvider值进行相应的业务计算并赋值给dataProvider相应的值!示例:
private var dataField:String =
public function onItemEditEnd(event:AdvancedDataGridEvent):void{
//记录当前编辑的列对应dataField
     dataField = event.dataF
  var initValue:String = ListCollectionView(advancedDataGrid.dataProvider).getItemAt(event.rowIndex)[event.dataField] as S
   if( event.reason == AdvancedDataGridEventReason.CANCELLED){
   var inputStr:String = TextInput(advancedDataGrid.itemEditorInstance).text
   var newValue:Number = Number(inputStr);
   if(isNaN(newValue)){
//If the inputed value is not a number
    TextInput(advancedDataGrid.itemEditorInstance).text = initV
  }else{
    ListCollectionView(advancedDataGrid.dataProvider).getItemAt(event.rowIndex)[event.dataField] = newV
   ListCollectionView(advancedDataGrid.dataProvider).refresh();
private function onItemFocusOut(event:AdvancedDataGridEvent):void{
 if(event.rowIndex == 3){
   //获取值
   var revenue:Number = ListCollectionView(advancedDataGrid.dataProvider).getItemAt(2)[dataField] as N
   var expense:Number = ListCollectionView(advancedDataGrid.dataProvider).getItemAt(3)[dataField] as N
   var otherVal1: Number = ...;
   var otherVal2:Number = ...;
   .......
   var newVal1:Number = ...;
   var newVal2: Number =...;
   ........
//将新计算的值设置回dataprovider
   ListCollectionView(advancedDataGrid.dataProvider).getItemAt(5)[dataField]= newVal1;
   ListCollectionView(advancedDataGrid.dataProvider).getItemAt(6)[dataField]= newVal2;
   ListCollectionView(advancedDataGrid.dataProvider).refresh();
songzi0206
浏览: 84980 次
来自: 上海
浏览量:18075
浏览量:8857
请问 查询 附近的 商店
能返回 距离具体值吗?
BeanDefinitionRegistry是个接口,图片错了 ...
三年了,距今三年了,三年前已经有人熟读源码,膜拜,邀想2012 ...
太专业了! 非常感谢!Flex — 在AdvancedDataGrid中合并单元格 (合并行)
Flex — 在AdvancedDataGrid中合并单元格 (合并行)
[摘要:文章出处及演示图片 /FLEX/thread-.aspx?extParms=ThreadCatalogID%3d6%26page%3d1 源代码 本版可 拜访http://code.谷歌.com/p/advanceddatagrid/]
文章出处及演示图片
/FLEX/thread-.aspx?extParms=ThreadCatalogID%3d6%26page%3d1
源代码原版可访问/p/advanceddatagrid/
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
IThao123周刊5216人阅读
Flex4中,将Tree控件插入到DataGrid中展示,可以看到非常炫的效果。其实平常看到的并不是DataGrid控件而是AdvancedDataGrid控件。使用AdvancedDataGrid将Tree控件放到其中使用,大概有两种方法,这里只介绍其中一种,还有一种方法是设置HierarchicalData为advancedDataGird的dataProvider,然后advancedDataGird.validateNow(),然后设置advancedDataGird的expandItem,这种方法还在学习当中。参考网址:效果图如下:&源代码:&?xml version=&1.0&?&&s:Application xmlns:fx=&/mxml/2009&&&&&&&&&&& && xmlns:s=&library:///flex/spark& &&&&&&&&&& && xmlns:mx=&library:///flex/mx&& &&& &fx:Script&&&&&&& &![CDATA[&&&&&&&&&& import mx.collections.ArrayC&&&&&&&&&& &&&&&&&&&& [Bindable]&&&&&&&&&& private var dpFlat:ArrayCollection = new ArrayCollection([&&&&&&&&&&&&& {Region:&Southwest&, Territory:&Arizona&, &&&&&&&&&&&&&&&&& Territory_Rep:&Barbara Jennings&, Actual:38865, Estimate:40000}, &&&&&&&&&&&&& {Region:&Southwest&, Territory:&Arizona&, &&&&&&&&&&&&&&&&& Territory_Rep:&Dana Binn&, Actual:29885, Estimate:30000},& &&&&&&&&&&&&& {Region:&Southwest&, Territory:&Central California&, &&&&&&&&&&&&&&&&& Territory_Rep:&Joe Smith&, Actual:29134, Estimate:30000},& &&&&&&&&&&&&& {Region:&Southwest&, Territory:&Nevada&, &&&&&&&&&&&&&&&&& Territory_Rep:&Bethany Pittman&, Actual:52888, Estimate:45000},& &&&&&&&&&&&&& {Region:&Southwest2&, Territory:&Northern California&, &&&&&&&&&&&&&&&&& Territory_Rep:&Lauren Ipsum&, Actual:38805, Estimate:40000}, &&&&&&&&&&&&& {Region:&Southwest2&, Territory:&Northern California&, &&&&&&&&&&&&&&&&& Territory_Rep:&T.R. Smith&, Actual:55498, Estimate:40000},& &&&&&&&&&&&&& {Region:&Southwest2&, Territory:&Southern California&, &&&&&&&&&&&&&&&&& Territory_Rep:&Alice Treu&, Actual:44985, Estimate:45000}, &&&&&&&&&&&&& {Region:&Southwest2&, Territory:&Southern California&, &&&&&&&&&&&&&&&&& Territory_Rep:&Jane Grove&, Actual:44913, Estimate:45000}&&&&&&&&&& ]);&&&&&& ]]&&&& &/fx:Script&&&& &&& &mx:Panel title=&AdvancedDataGrid Control Example&&&&&&&&&&& & height=&75%& width=&75%& layout=&horizontal&&&&&&&&&&& & paddingTop=&10& paddingBottom=&10& paddingLeft=&10& paddingRight=&10&&&&&&&& &&&&&& &!--treeColumn={colID}可以在AdvancedDataGrid指定tree在哪里显示,默认为第一列--&&&&&&& &mx:AdvancedDataGrid id=&myADG& &&&&&&&&&&&&&&&&&&&&&&&& &width=&100%& height=&100%&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&& &initialize=&gc.refresh();&&&&&&&&& &&&&&&&&&& &mx:dataProvider&&&&&&&&&&&&&& &mx:GroupingCollection2 id=&gc& source=&{dpFlat}&&&&&&&&&&&&&&&&&&& &mx:grouping&&&&&&&&&&&&&&&&&&&&& &mx:Grouping&&&&&&&&&&&&&&&&&&&&&&&&& &!--先以具有相同Region属性的对象为节点进行分组,&&&&&&&&&&&&&&&&&&&&&&&& 然后以具有相同Territory属性的对象为节点进行分组--&&&&&&&&&&&&&&&&&&&&&&&&& &mx:GroupingField name=&Region&/&&&&&&&&&&&&&&&&&&&&&&&&& &mx:GroupingField name=&Territory&/&&&&&&&&&&&&&&&&&&&&& &/mx:Grouping&&&&&&&&&&&&&&&&&& &/mx:grouping&&&&&&&&&&&&&& &/mx:GroupingCollection2&&&&&&& &&& &/mx:dataProvider&&&&&&&& &&&&&&&&&& &&&&&&&&&& &mx:columns&&&&&&&&&&&&&& &!--如果该列为tree的显示列,那么dataField为tree最后节点的值--&&&&&&&&&&&&&& &mx:AdvancedDataGridColumn dataField=&Territory_Rep&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && headerText=&Region&/&&&&&&&&&&&&&& &mx:AdvancedDataGridColumn dataField=&Territory& /&&&&&&&&&&&&&& &mx:AdvancedDataGridColumn dataField=&Territory_Rep&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && headerText=&Territory Rep&/&&&&&&&&&&&&&& &mx:AdvancedDataGridColumn dataField=&Actual&/&&&&&&&&&&&&&& &mx:AdvancedDataGridColumn dataField=&Estimate&/&&&&&&&&&&& &/mx:columns&&&&&&& &/mx:AdvancedDataGrid&&&& &/mx:Panel&&&& &/s:Application&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:111282次
积分:1648
积分:1648
排名:第19390名
原创:52篇
转载:21篇
(1)(1)(1)(2)(1)(1)(4)(1)(1)(1)(2)(2)(2)(1)(1)(1)(2)(2)(2)(11)(1)(3)(2)(9)(10)(5)(1)(1)(2)本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 easyui datagrid 合计 的文章

 

随机推荐