Flex 3 AdvancedDataGrid的使用(八)
我们继续来讲AdvancedDataGrid的使用。您可以通过创建自定义的条目渲染器(item renderers)或者条目编辑器(item editors)来定制AdvancedDataGrid中单元格的外观和行为…
在AdvancedDataGrid中使用条目渲染器(item renderers) 您可以通过创建自定义的条目渲染器(item renderers)或者条目编辑器(item editors)来定制AdvancedDataGrid中单元格的外观和行为。与DataGrid处理的方法类似,我们直接将条目渲染器(item renderers)或者条目编辑器(item editors)赋值给AdvancedDataGrid的列就可以了。关于 item renderers 和 item editors的更多介绍,请查看: Using Item Renderers and Item Editors。 AdvancedDataGrid在对于项目渲染器的支持上增加了一些新的特性,这些新的特性可以让您处理下面的操作:
注意:这些新的特性只支持项目渲染器;项目编辑器的用法和DataGrid中的用法相同。 使用项目渲染器 要使用AdvancedDataGrid控件中新的项目渲染器特性,您需要直接使用AdvancedDataGrid.rendererProviders属性将项目渲染器指定给AdvancedDataGrid控件本身,而不是像DataGrid中,指定给特定列。下面的示例中指定一个项目渲染器给Estimate列: [xml] <mx:AdvancedDataGrid> <mx:columns> <mx:AdvancedDataGridColumn dataField="Region"/> <mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep"/> <mx:AdvancedDataGridColumn dataField="Actual"/> <mx:AdvancedDataGridColumn dataField="Estimate"/> </mx:columns> <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider columnIndex="3" columnSpan="1" renderer="myComponents.EstimateRenderer"/> </mx:rendererProviders> </mx:AdvancedDataGrid> rendererProviders属性包含一个AdvancedDataGridRendererProvider实例数组。每个AdvancedDataGridRendererProvider实例定义一个项目渲染器个特性。 在前面的示例中,AdvancedDataGridRendererProvider实例表示,对于第3列使用EstimateRenderer,AdvancedDataGrid控件中的首列是列0,并且该渲染器跨越单列。如果您将columnSpan属性设置为0,该渲染器将横跨行的所有列。 不但可以将列索引指定渲染器,您还可以给某列指定一个id属性,然后将该列属性来将该列与渲染器关联。如下所示: [xml] <mx:AdvancedDataGrid> <mx:columns> <mx:AdvancedDataGridColumn dataField="Region"/> <mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep"/> <mx:AdvancedDataGridColumn dataField="Actual"/> <mx:AdvancedDataGridColumn id="estCol" dataField="Estimate"/> </mx:columns> <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider column="{estCol}" columnSpan="1" renderer="myComponents.EstimateRenderer"/> </mx:rendererProviders> </mx:AdvancedDataGrid> depth属性使得您可以将渲染器与AdvancedDataGrid控件的导航树层次结构中的特定层次关联,导航树的最顶级depth为1。下面示例将渲染器与导航树第三层关联: [xml] <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider columnIndex="3" depth="3" columnSpan="1" renderer="myComponents.EstimateRenderer"/> </mx:rendererProviders> 在前面的示例中,AdvancedDataGrid控件将一直使用缺省的列渲染器直到您将导航树展开到第三层,这时候它才使用EstimateRenderer组件。您可以使用depth属性为同一列指定不同的渲染器,在depth属性指定树的每个层次使用的渲染器。 一个渲染器可以跨越多个列。在下面的示例中,您创建了一个横跨两列的渲染器: <mx:AdvancedDataGrid> <mx:columns> <mx:AdvancedDataGridColumn dataField="Region"/> <mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep"/> <mx:AdvancedDataGridColumn id="actCol" dataField="Actual"/> <mx:AdvancedDataGridColumn dataField="Estimate"/> </mx:columns> <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider column="{actCol}" depth="3" columnSpan="2" renderer="myComponents.SummaryRenderer"/> </mx:rendererProviders> </mx:AdvancedDataGrid> 前面示例使用单个渲染器跨越Actual和Estimate列来显示一个这些列数据的组合视图。要查看SummaryRenderer组件的某个实现,请查看“使用渲染器生成列数据”。 下表是AdvancedDataGridRendererProvider类中您可以用来配置渲染器的属性的描述:
使用渲染器生成列数据 下面示例使用一个项目渲染器来计算AdvancedDataGrid控件列的差额,如下图片所示: 该示例定义了id为diffCol的列,该列不和数据源的任意数据字段关联。相应的,您使用rendererProvider 属性给列指定一个项目渲染器。该项目渲染器计算actual和estimate的差值,并将接着显示一个是否超过预算的消息。 下面的代码实现该示例: [xml] <?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; include "SimpleHierarchicalData.as"; ]]> </mx:Script> <mx:AdvancedDataGrid width="100%" height="100%"> <mx:dataProvider> <mx:HierarchicalData source="{dpHierarchy}"/> </mx:dataProvider> <mx:columns> <mx:AdvancedDataGridColumn dataField="Region"/> <mx:AdvancedDataGridColumn dataField="Territory_Rep" headerText="Territory Rep"/> <mx:AdvancedDataGridColumn dataField="Actual"/> <mx:AdvancedDataGridColumn dataField="Estimate"/> <mx:AdvancedDataGridColumn id="diffCol" headerText="Difference"/> </mx:columns> <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider column="{diffCol}" depth="3" renderer="myComponents.SummaryRenderer"/> </mx:rendererProviders> </mx:AdvancedDataGrid> </mx:Application> 以下是SummaryRenderer组件的代码: [java] <?xml version="1.0"?> <!-- myComponents/SummaryRenderer.mxml --> <mx:Label xmlns:mx="http://www.adobe.com/2006/mxml" textAlign="center"> <mx:Script> <![CDATA[ override public function set data(value:Object):void { // Calculate the difference. var diff:Number = Number(value["Actual"]) - Number(value["Estimate"]); if (diff < 0) { // If Estimate was greater than Actual,// display results in red. setStyle("color","red"); text = "Undersold by " + usdFormatter.format(diff); } else { // If Estimate was less than Actual,// display results in green. setStyle("color","green"); text = "Exceeded estimate by " + usdFormatter.format(diff); } } ]]> </mx:Script> <mx:CurrencyFormatter id="usdFormatter" precision="2" currencySymbol="$" decimalSeparatorFrom="." decimalSeparatorTo="." useNegativeSign="true" useThousandsSeparator="true" alignSymbol="left"/> </mx:Label> 运行示例 使用横跨整行的项目渲染器 您可以在一个分层数据上使用某一项目渲染器设置其显示整行数据。下面示例是一个PieChart(饼图)控件来显示分层数据中的detail字段数据。每行包含的detail信息是各个代表的销售收入信息,下面是其中一个显示图表: 以下代码实现该示例: [java] <?xml version="1.0"?> <!-- dpcontrols/adg/GroupADGChartRenderer.mxml --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; [Bindable] private var dpHierarchy:ArrayCollection= new ArrayCollection([ {name:"Barbara Jennings",region: "Arizona",total:70,children:[ {detail:[{amount:5},{amount:10},{amount:20},{amount:45}]}]},{name:"Dana Binn",total:130,children:[ {detail:[{amount:15},{amount:25},{amount:35},{amount:55}]}]},{name:"Joe Smith",region: "California",total:229,children:[ {detail:[{amount:26},{amount:32},{amount:73},{amount:123}]}]},{name:"Alice Treu",total:230,children:[ {detail:[{amount:159},{amount:235},{amount:135},{amount:155}]} ]} ]); ]]> </mx:Script> <mx:AdvancedDataGrid id="myADG" width="100%" height="100%" variableRowHeight="true"> <mx:dataProvider> <mx:HierarchicalData source="{dpHierarchy}"/> </mx:dataProvider> <mx:columns> <mx:AdvancedDataGridColumn dataField="name" headerText="Name"/> <mx:AdvancedDataGridColumn dataField="total" headerText="Total"/> </mx:columns> <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider dataField="detail" renderer="myComponents.ChartRenderer" columnIndex="0" columnSpan="0"/> </mx:rendererProviders> </mx:AdvancedDataGrid> </mx:Application> 您可以修改该示例以在单列中显示PieChart控件。在下面的例子中,增加了一个Detail列给该控件,然后将该控件指定为第2列的项目渲染器: [java] <?xml version="1.0"?> <!-- dpcontrols/adg/GroupADGChartRendererOneRow.mxml --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; [Bindable] private var dpHierarchy:ArrayCollection= new ArrayCollection([ {name:"Barbara Jennings",{amount:155}]} ]} ]); ]]> </mx:Script> <mx:AdvancedDataGrid id="myADG" width="100%" height="100%" variableRowHeight="true"> <mx:dataProvider> <mx:HierarchicalData source="{dpHierarchy}"/> </mx:dataProvider> <mx:columns> <mx:AdvancedDataGridColumn dataField="name" headerText="Name"/> <mx:AdvancedDataGridColumn dataField="total" headerText="Total"/> <mx:AdvancedDataGridColumn dataField="detail" headerText="Detail"/> </mx:columns> <mx:rendererProviders> <mx:AdvancedDataGridRendererProvider dataField="detail" renderer="myComponents.ChartRenderer" columnIndex="2"/> </mx:rendererProviders> </mx:AdvancedDataGrid> </mx:Application> 《AdvancedDataGrid的使用》到此完成,本介绍其他部分:
另外,完整的《AdvancedDataGrid的使用》已经发布到了FlexWiki,这里我们再次邀请各位朋友加入到我们的FlexWiki计划中来,更多信息请访问:wiki.flexsearch.cn (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |