`
songzi0206
  • 浏览: 158831 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
Group-logo
All are from ...
浏览量:33812
Group-logo
Programming w...
浏览量:19681
社区版块
存档分类
最新评论

Flex AdvancedDataGrid 动态构建和编辑并计算

    博客分类:
  • Flex
阅读更多

 

    项目实在太紧,多线程模块SIT还没结束,一堆前台的问题也得亲自上阵,马不停蹄加班加点到这一刻终于收工,趁热记录下遇到过的两个纠结的功能。今天先写第一个: 

     关于flex动态AdvancedDataGrid的操作,前台根据后台返回数据构建一个动态的grid不算纠结,就略去,要说的是动态的可以编辑某些单元格不是所有单元格都能编辑,只是一小部分。一旦单元格编辑完毕,有些依赖的格子就得做相应的计算,改变其值。举个例子吧:

 


    如上图是一个FlexAdvancedDataGrid,后台返回有两批记录,每批记录都构建一列。现在每一列的第三行(也就是Revenue对应的行)的数字是可以改变的,而其他行不能改变,当某一列的第三行数字改变以后,该列所在的其他部分行的值就要相应改变,比如第五行的值=第三行的值 - 第四行的值;第一行的值 = 第三行的值/第六行的值,等等。

 

  貌似很简单,edit功能只要指定editable就可以,计算么可以在修改完之后去根据AdvancedDataGrid 获取指定的单元格然后设置其值就ok,嘿嘿,我开始也是这么想的。可惜,首先AdvancedDataGrid没有cell的概念,所以想要通过AdvancedDataGrid去获得单元格是困难的;其次这个AdvancedDataGrid是动态构建的,而且这个editable属性无法加到特定的格子里,要么整列,要么整个grid。肿么办?

  查了下api,好在AdvancedDataGridedit相关的事件onItemEditBeginonItemEditEnd等。看来可以从这里做文章,对的,可以在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属性很容易获取。那如果获取非当前editcell的值呢?计算以后的值如何设置给正确的cell呢?

既然无法通过AdvancedDataGrid获取类似cell,那很容易让人想到的通过他的dataProvider属性。没错,AdvancedDataGriddataProvider可以通过转化为类型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] = newCalVal;

 

 

没错,这样确实能达到准确获取数据,并计算好准确的设置给griddataProvider,按理dataProvider改变了,grid自然就达到显示效果了。但是调式中却发现,值的获取、计算都没问题,计算的新值也确实反映到griddataProvider中了,griddataProvider的绑定数据集也是正确的,但是页面上的grid显示值就是不改变!悲摧中,发现通过这样赋值是可以改变页面显示的:TextInput(advancedDataGrid.itemEditorInstance).text = initValue;但是这只能修改当前编辑的格子的值,远远不够啊!于是我尝试在onItemEditEnd中做了这样一件事情:当计算出新值后,我重新指定griddataProvider对象: 

  var newCol:ArrayCollection = new ArrayCollection(ObjectUtils.copy(advancedDataGrid.dataProvider.source) as Array); do something new to set new values for the newCol; advancedDataGrid.dataProvider = newCol;

调试中发现更悲剧的问题:当在onItemEditEnd事件中执行上面最后一行即重新设置dataProvider对象时,死循环发生了!advancedDataGrid.dataProvider = newCol会使得advancedDataGrid重新执行onItemEditEnd事件,而事件中又设置....! 这个问题有点tricky,在api上也没有相关的说明啊。

一筹莫展,但是相信flex肯定是有方法可以做到的,要不也太恶心而来吧。既然onItemEditEnd中会死循环,设置新值以后页面表格显示也不会刷新,显然不能在这个事件中做这些事情呗!对,编辑完了以后,可以在当前格子失去焦点的时候做这些事情啊!马上测试,在事件onItemFocusOut随便设置了下ListCollectionView(appetiteDataGrid.dataProvider).getItemAt(2)[dataField]=111; 页面生效!有戏啊!下面的工作就顺利多了:在onItemEditEnd中记录当前修改的格子对应的dataField(因为在onItemFocusOut无法获取),并把user新修改的值设置到advancedDataGriddataProvider(这在前面悲剧的尝试中发现是可行的),然后在onItemFocusOut事件中可以拿到最新的dataProvider值进行相应的业务计算并赋值给dataProvider相应的值!示例:

private var dataField:String = null;
public function onItemEditEnd(event:AdvancedDataGridEvent):void{
	//记录当前编辑的列对应dataField
       dataField = event.dataField;
    var initValue:String = ListCollectionView(advancedDataGrid.dataProvider).getItemAt(event.rowIndex)[event.dataField] as String;
   if( event.reason == AdvancedDataGridEventReason.CANCELLED){
	return;
   }
   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 = initValue;
    	return;
    }else{
        ListCollectionView(advancedDataGrid.dataProvider).getItemAt(event.rowIndex)[event.dataField] = newValue;
        ListCollectionView(advancedDataGrid.dataProvider).refresh();
     }
}

private function onItemFocusOut(event:AdvancedDataGridEvent):void{
 if(event.rowIndex == 3){
   //获取值
   var revenue:Number = ListCollectionView(advancedDataGrid.dataProvider).getItemAt(2)[dataField] as Number;
   var expense:Number = ListCollectionView(advancedDataGrid.dataProvider).getItemAt(3)[dataField] as Number;
   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();
  }
}

 

 

 

 

  • 大小: 33.9 KB
分享到:
评论

相关推荐

    Flex应用AdvancedDataGrid表头皮肤

    综上所述,Flex的AdvancedDataGrid表头皮肤设计涉及到了组件皮肤、样式、主题、交互行为等多个方面,开发者需要对Spark皮肤机制有深入理解,并熟悉Flex的图形和数据可视化技术。通过精心设计和实现,可以创建出既...

    FLEX AdvancedDataGrid 复选框

    总之,“FLEX AdvancedDataGrid 复选框”涉及了Flex组件定制、数据绑定、事件处理、状态管理等多个方面,是提高用户交互性和功能性的关键技术。通过理解并应用这些知识,开发者可以构建出更加强大且易用的数据展示...

    Flex技术中AdvancedDataGrid使用方法

    ### Flex技术中AdvancedDataGrid使用方法 #### 一、多列排序 在默认情况下,`AdvancedDataGrid`组件会按照数据被添加至其`DataProvider`的顺序来展示数据。与`DataGrid`组件类似,`AdvancedDataGrid`也支持用户在...

    flex advancedDataGrid 中如何实现带checkbox的树

    在Flex开发中,AdvancedDataGrid组件是一个功能强大的数据网格,它可以显示层次结构的数据,并提供了丰富的定制选项。在一些应用场景中,我们可能需要在AdvancedDataGrid中实现带有复选框的树形结构,以便用户可以...

    AdvancedDataGrid 动态添加节点 控制树

    在Flex开发中,AdvancedDataGrid是一个强大的组件,用于展示大量数据并进行复杂的数据操作,如分组、排序和过滤。这个组件特别适用于构建数据密集型的用户界面,尤其是在需要显示层次结构数据时。本篇文章将深入探讨...

    flex AdvancedDataGrid实现checkBox全选功能

    在Flex开发中,AdvancedDataGrid是一款强大的数据网格组件,它提供了丰富的数据展示和交互功能,如排序、分组、过滤等。在实际应用中,我们经常需要为用户提供选择多条数据的能力,这时CheckBox的选择功能就显得尤为...

    flex 使用AdvancedDataGrid组件的课件管理系统

    总结,这个“flex 使用AdvancedDataGrid组件的课件管理系统”示例项目,为开发者提供了一个很好的起点,展示了如何利用Flex和AdvancedDataGrid组件构建数据驱动的应用。通过研究和扩展这个项目,开发者可以掌握更...

    AdvancedDataGrid动态加载.rar

    8. **数据绑定和事件处理**:确保正确地绑定数据源,并处理好数据加载、错误和完成事件,以保持UI的同步和用户体验的流畅。 9. **性能优化**:在处理大量数据时,优化数据转换和格式化过程,避免不必要的计算,可以...

    flex-datagrid-advancedDataGrid-demo

    在Flex编程领域,数据网格(DataGrid)是用于展示大量结构化数据的组件,而AdvancedDataGrid则是DataGrid的一个增强版,提供了更为丰富的功能和更高级的定制能力。本示例"flex-datagrid-advancedDataGrid-demo"显然...

    AdvancedDataGrid综合应用

    这个主题涵盖了如何在Flex项目中有效地利用AdvancedDataGrid来实现数据的高级显示和操作。 1. **AdvancedDataGrid概述** AdvancedDataGrid是Adobe Flex中的一个组件,它主要用于展示结构化的数据,如表格数据。与...

    flex css设计器

    这款工具提供了一个可视化的环境,使得设计师和开发者能够更直观、便捷地调整Flex控件的外观和布局,从而提升Flex应用的界面美观度和用户体验。 Flex是一种由Adobe开发的开源框架,用于构建富互联网应用程序(RIA)...

    flex导出excel的代码

    <![CDATA[ import mx.controls.CheckBox; import mx.controls.Alert; import com.as3xls.xls.ExcelFile;... Alert.show("行的数据分别是:"+o.idx+"/"+o.names+"/"+o.sex);...</mx:WindowedApplication>

    Flex 全选效果 批量删除

    在Flex编程中,AdvancedDataGrid和DataGrid是两种常用的组件,用于展示数据并提供交互功能。本示例项目“Flex全选效果批量删除”聚焦于如何实现这些组件的一个实用功能,即用户可以通过全选复选框来一次性选择多个...

    AdvancedDataGrid datavisualization.swc

    flex datavisualization.swc flex 3 AdvancedDataGrid

    Flex中AdvancedDataGrid的用法示例介绍

    Flex是由Adobe公司推出的一个开源的富互联网应用程序(RIA)开发框架,它可以用来构建具有高交互性的Web应用。在Flex开发中,AdvancedDataGrid组件是一个常用的显示表格数据的组件,其功能比基础的DataGrid组件更为...

    表格演示(1)AdvancedDataGrid应用

    在Flex开发中,AdvancedDataGrid相比普通的DataGrid,提供了更丰富的功能和更高级的定制能力。它支持多列排序、分层数据展示、拖放操作、自定义渲染器以及高级筛选等功能,这使得开发者能够构建出更为复杂的表格应用...

    最新的AdvancedDataGrid行嵌套AdvancedDataGrid实现

    最新的AdvancedDataGrid行嵌套AdvancedDataGrid实现,该例子只是实现AdvancedDataGrid利用AdvancedDataGridRendererProvider在行中渲染另外一个AdvancedDataGrid,当然也可以渲染其它任何想渲染的界面或者组件,价值...

    AdvancedDataGrid或datagrid导出到excel.rar

    AdvancedDataGrid或datagrid导出到excel.rar AdvancedDataGrid或datagrid导出到excel.rar AdvancedDataGrid或datagrid导出到excel.rar

    DataGrid和AdvancedDataGrid CheckBox全选功能1.1

    在本文中,我们将深入探讨如何在Flex中实现DataGrid和AdvancedDataGrid组件的CheckBox全选功能。这个功能在数据展示和交互式操作中非常常见,它允许用户通过一个主CheckBox来选择或取消选择所有行数据。 首先,我们...

    Flex详细文档.pdf

    Flex的核心优势在于其能够跨平台运行,并且提供了一套完整的开发工具链,使得开发者能够更加高效地创建和部署动态的Web应用。 ##### 1. Flex基础 - **MXML**: MXML是Flex的主要标记语言,它是一种基于XML的语言,...

Global site tag (gtag.js) - Google Analytics