参考 http://www.cnblogs.com/xuehai/archive/2009/09/26/1574531.html
<mx:columns>
<mx:AdvancedDataGridColumn dataField="Artist" />
<mx:AdvancedDataGridColumn dataField="Album" />
<mx:AdvancedDataGridColumn dataField="Price" />
</mx:columns>
<mx:dataProvider>
<fx: Object Artist='Pavement' Album='Brighten the Corners' Price='13.99'/>
<fx: Object Artist='Saner' Album='A Child Once' Price='14.99'/>
<fx: Object Artist='Saner' Album='Helium Wings' Price='12.99'/>
<fx: Object Artist='The Doors' Album='The Doors' Price='10.99'/>
<fx: Object Artist='The Doors' Album='Morrison Hotel' Price='12.99'/>
<fx: Object Artist='Grateful Dead' Album='American Beauty' Price='11.99'/>
<fx: Object Artist='Grateful Dead' Album='In the Dark' Price='17.99'/>
<fx: Object Artist='Grateful Dead' Album='Shakedown Street' Price='13.99'/>
<fx: Object Artist='The Doors' Album='Strange Days' Price='12.99'/>
<fx: Object Artist='The Doors' Album='The Best of the Doors' Price='10.99'/>
</mx:dataProvider>
</mx:AdvancedDataGrid>
运行以上示例,如下进行排序:
点击AdvancedDataGrid组件的任意列表头对任意列进行排序,例如点击Artist列的列表头Artist列将升序进行排序,再次点击的话将按降序排序。
按住Control键,点击其他任意的列头,例如点击Price列头,将在保持Artist列降序排列的情况下,将Price列按升序排列。现在你可以从中发现某一艺术家最便宜的专辑。
再次点击Price列头,Price列将按降序排列
按住Control键,点击任意其他列,将其加入排序条件中。
<mx:columns>
<mx:AdvancedDataGridColumn dataField="Artist" />
<mx:AdvancedDataGridColumn dataField="Album" />
<mx:AdvancedDataGridColumn dataField="Price" />
</mx:columns>
<mx:dataProvider>
<fx: Object Artist='Pavement' Album='Brighten the Corners' Price='14.91'/>
<fx: Object Artist='Saner' Album='A Child Once' Price='14.99'/>
<fx: Object Artist='Saner' Album='Helium Wings' Price='12.99'/>
<fx: Object Artist='The Doors' Album='The Doors' Price='10.99'/>
<fx: Object Artist='The Doors' Album='Morrison Hotel' Price='12.99'/>
<fx: Object Artist='Grateful Dead' Album='American Beauty' Price='11.99'/>
<fx: Object Artist='Grateful Dead' Album='In the Dark' Price='17.99'/>
<fx: Object Artist='Grateful Dead' Album='Shakedown Street' Price='13.99'/>
<fx: Object Artist='The Doors' Album='Strange Days' Price='12.99'/>
<fx: Object Artist='The Doors' Album='The Best of the Doors' Price='10.99'/>
</mx:dataProvider>
</mx:AdvancedDataGrid>
{
if(data["Price"] <= 11.00) return {color:0x00FF00}; return null;
}
选择多个单元格及多行
所有基于List的控件都支持allowMultipleSelection属性。将 allowMultipleSelection属性设置为True可以使得您在控件中一次选择不止一个条目。例如,DataGrid控件可以让您选择多行 这样您就可以将他们拖放到另一个DataGrid中。
AdvancedDataGrid增加了可以让您选择多个单元格的新的特性,一旦已选择,您就可以将其拖放到另一个AdvancedDataGrid控件中、将它们拷贝到剪切板中或者在单元格数据进行某些其他的处理。
您可以使用AdvancedDataGrid控件的selectionMode和 allowMultipleSelection配置多重选择。selectionMode的缺省属性是singleRow,这就是说您一次只能选择单行。 要多重选择,需要将selectionMode属性设置为multipleRows或者multipleCells。
多个单元格的选择方式和表格处理软件中的用法相似,连续的使用Shift键,非连续的使用Control建。
选择控件中邻近的单元
- 点击第一个单元,在某行或某列,选择它。
- 在选择其他的单元时按下Shift键。如果selectionMode设置为multipleRows,点击任何其他行的单元格来选择多个时,将选择邻近的行。如果selectionMode设置为multipleCells,点击任何单元格,将选择邻近的单元格
选择控件中非邻近的单元
- 点击第一个单元,在某行或某列,选择它。
- 在选择其他的单元时按下Control键。如果selectionMode设 置为multipleRows,点击任何其他行的单元格来选择多个时,将选择该单独的行。如果selectionMode设置为 multipleCells,点击任何单元格,将选择该单独的单元格
一旦选择了AdvancedDataGrid控件的某行或列时,该控件将更新selectedCells属性来记录您的 选择信息。selectedCells是一个对象数组,它包含的每个对象都有一个rowIndex和columnIndex属性来表示您选择的单元格在控 件中的行列的位置。
selectionMode属性的值决定了rowIndex和columnIndex属性的值,如下表所示:
selectionMode属性 | rowIndex和columnIndex属性值 |
none | 控件不允许选择,并且selectedCells为null |
singleRow | 点击某行的任意单元来选择该行。 在选择后,selectedCells包含一个单独对象: [{rowIndex:selectedRowIndex, columnIndex: -1}] |
multipleRows | 点击某行的任意单元来选择该行。 对于非邻近行,按下Control键时,点击其他行的单元格来选择其他行。 对于邻近行,按下Shfit键时,点击其他行的单元格来选择多个连续的行。 选择后,每行在selectedCells保存为一个对象: [ {rowIndex: selectedRowIndex1, columnIndex: -1}, |
singleCell | 点击任意单元来选择该单元格。 在选择后,selectedCells包含一个单独对象: [{rowIndex: selectedRowIndex, columnIndex:selectedColIndex}] |
multipleCells | 点击任意单元来选择该单元格。 对于非邻近单元,按下Control键时,点击任意单元格来选择多个非连续的单元格。 对于邻近单元,按下Shfit键时,点击任意单元格来选择多个连续的单元格。 选择后,每行在selectedCells保存为一个对象: [ {rowIndex: selectedRowIndex1, columnIndex: selectedColIndex1}, |
以下示例设置selectionMode属性为multipleCells使得您可以选择表格中的多个单元。该应用使用KeyUp事件处理器来识别Control-C组合键,如果监听到,将选择的多个单元格从AdvancedDataGrid控件复制到系统剪贴板中。
在拷贝单元格后,您可以将这些单元格粘贴到Flex应用的其他位置中,或者将它们粘贴到其他应用如微软Excel。您可以将它们粘贴到应用底部的TextArea中去。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import flash.events.KeyboardEvent;
import flash.system.System;
include "StyleData.as"
// Event handler to recognize when Ctrl-C is pressed,
// and copy the selected cells to the system clipboard.
private function myKeyUpHandler(event:KeyboardEvent):void
{
var keycode_c:uint = 67;
if (event.ctrlKey && event.keyCode == keycode_c)
{
// Separator used between Strings sent to clipboard
// to separate selected cells.
var separator:String = ",";
// The String sent to the clipboard
var dataString:String = "";
// Loop over the selectedCells property.
// Data in selectedCells is ordered so that
// the last selected cell is at the head of the list.
// Process the data in reverse so
// that it appears in the correct order in the clipboard.
var n:int = event.currentTarget.selectedCells.length;
for (var i:int = 0; i < n; i++)
{
var cell:Object = event.currentTarget.selectedCells[i];
// Get the row for the selected cell.
var data:Object =
event.currentTarget.dataProvider[cell.rowIndex];
// Get the name of the field for the selected cell.
var dataField:String =
event.currentTarget.columns[cell.columnIndex].dataField;
// Get the cell data using the field name.
dataString = data[dataField] + separator + dataString;
}
// Remove trailing separator.
dataString =
dataString.substr(0, dataString.length - separator.length);
// Write dataString to the clipboard.
System.setClipboard(dataString);
}
}
]]>
</mx:Script>
<mx:AdvancedDataGrid width="100%" height="100%"
dataProvider="{dpADG}"
selectionMode="multipleCells"
allowMultipleSelection="true"
keyUp="myKeyUpHandler(event);">
<mx:columns>
<mx:AdvancedDataGridColumn dataField="Artist"/>
<mx:AdvancedDataGridColumn dataField="Album"/>
<mx:AdvancedDataGridColumn dataField="Price"/>
</mx:columns>
</mx:AdvancedDataGrid>
<mx:TextArea id="myTA"/>
</mx:Application>
分层和分组数据显示
AdvancedDataGrid支持分级和分组数据的显示,为了支持这样的显示,AdvancedDataGrid在第一列显示一个导航树以让您分级浏览数据。
分层数据(Hierarchical data)是一种以父子项目结构分层的数据,分组数据(Grouped data)是一开始就为平面的而无内在层次关系的数据。在将该数据传递给AdvancedDataGrid前,您可以指定一个或更多的数据字段将一组数据归组为同一层次。
以下文件中的代码演示分级数据示例:
//SimpleHierarchicalData.as:
[Bindable]
private var dpHierarchy:ArrayCollection = new ArrayCollection([
{Region:"Southwest", children: [
{Region:"Arizona", children: [
{Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]},
{Region:"Central California", children: [
{Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]},
{Region:"Nevada", children: [
{Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]},
{Region:"Northern California", children: [
{Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]},
{Region:"Southern California", children: [
{Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
]}
]);
注意该数据的顶层数据包含一个Region字段和多个第二层子对象,每个第二层子对象也包含一个Region字段和多个其他的子对象,以下示例演示AdvancedDataGrid控件对该数据的显示效果:
该示例的代码在“控制导航树”章节中。
要显示扁平数据,在将其传递给AdvancedDataGrid前您首先要对数据进行归组。以下代码包含的是前面示例中分层数据的变异版本,其将数据组织为以平面结构:
[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:"Southwest", Territory:"Northern California",
Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}
]);
在该示例中,数据只包含一个层面没有内在的层次的单独纪录,要归组该数据,您可以指定一个或更多的数据字段将该数据归组为同一层次。以下示例演示AdvancedDataGrid控件对平面数据通过Region字段进行的分组。
要配置AdvancedDataGrid显示分级数据和导航树,您传递给dataProvider属性以 HierarchicalData类或者GroupingCollection类的实例,当您的数据以层次组织时使用HierarchicalData 类。更多信息请查看“显示分层数据”。
当您的数据以平面结构组织时使用GroupingCollection类,作为配置一个GroupingCollection类的实例的一部分,您需要指定一个或更多的字段来将平面数据组织为同一层次。更多信息请查看“显示分组数据”。
您可以从任意数据创建一个HierarchicalData类或GroupingCollection类的实例来作为数据源。但是,AdvancedDataGrid控件按如下修改它为内部的数据表示:
- 一个数组实例在AdvancedDataGrid控件内部使用一个ArrayCollection类实例表示。
- 一个ArrayCollection在AdvancedDataGrid控件内部使用一个ArrayCollection类实例表示。
- 一个包含正确XML文本的字符串在AdvancedDataGrid控件内部使用一个XMLListCollection类实例表示。
- 一个XMLNode实例在AdvancedDataGrid控件内部使用一个XMLListCollection类实例表示。
- 一个XMLList实例在AdvancedDataGrid控件内部使用一个XMLListCollection类实例表示。
- 任何实现ICollectionView接口的对象在AdvancedDataGrid控件内部使用一个ICollectionView实例表示。
- 一个其他任意类型的对象被作为唯一的条目包裹在一个的数组示例中。
例如,如果您使用一个数组来创建HierarchicalData类的一个实例,并将该 HierarchicalData实例传递给AdvancedDataGrid.dataProvider属性,然后又从 AdvancedDataGrid.dataProvider属性将其读回;您读回的数据将是一个ArrayCollection实例。
控制导航树
AdvancedDataGrid控件有时候因为该控件的第一列使用一个可缩放数来选择行的显示而被称作tree datagrid,唯一要记住的规则是该树总是显示在所有列的最左边。尽管在AdvancedDataGrid控件您可以任意组织列而不管数据是如何组织的。并且您可以通过拖动列来对AdvancedDataGrid控件上的列进行重新定位,但是导航树总是出现在列的最左边。
数据表格的第一列通常与该控件的数据源的某一字段关联。该数据字段用于为树节点标签命名。
在以下示例中,想您展示了“分层和分组数据显示”章节提到的AdvancedDataGrid控件分层结构数据的显示。该数据的顶层数据包含一个Region字段和多个第二层子对象,每个第二层子对象也包含一个Region字段和多个其他的子对象。
该示例中的AdvancedDataGrid控件定义了四列来显示数据:Region、Territory Rep、 Actual和Estimate。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<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:columns>
</mx:AdvancedDataGrid>
</mx:Application>
以下图片为上述示例创建的AdvancedDataGrid控件。该控件使用文件夹图标表示数据分支节点,使用文件图标代表叶子节点。控件的第一列和数据源的Region相关联。所以标签显示的是Region字段的值。
注意树的叶子图标没有显示标签。这是因为每个territory都没包含Region字段。下一章我们将描述怎样控制导航树的图标显示。
设置导航树图标和标签
导航树可以让您控制分支和叶子节点的图标和标签。您可显示一个有标签无图标的树、一个只有分支图标的树、一个所有都没有标签的树或者一个不与任何数据字段相关的自由列数。
以下表描述了AdvancedDataGrid控件用于设置树图标的样式属性:
样式属性 | 描述 |
defaultLeafIcon | 指定叶子节点图标 |
disclosureClosedIcon | 指定显示在封闭的分支节点前面的图标,缺省是一个黑三角形。 |
disclosureOpenIcon | 指定显示在展开的分支节点前面的图标,缺省是一个黑三角形。 |
folderClosedIcon | 为分支节点指定一个文件夹关闭图标 |
folderOpenIcon | 为分支节点指定一个文件夹打开图标 |
以下示例设置缺省叶子图标为null以隐藏它,并且使用自定义的文件夹打开和关闭图标:
<?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%"
defaultLeafIcon="{null}"
folderOpenIcon="@Embed(source='assets/folderOpenIcon.jpg')"
folderClosedIcon="@Embed(source='assets/folderClosedIcon.jpg')">
<mx:dataProvider>
<mx:HierarchicalData source="{myHCollAC}"/>
</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:columns>
</mx:AdvancedDataGrid>
</mx:Application>
您也可以使用setStyle()方法和<mx:Style>标签指定样式。如下所示:
<mx:Style>
AdvancedDataGrid {
defaultLeafIcon:ClassReference(null);
folderOpenIcon:Embed(source='assets/folderOpenIcon.jpg');
folderClosedIcon:Embed(source='assets/folderClosedIcon.jpg');
}
</mx:Style>
为导航树创建单独的列
在“分层和分组数据显示”章节的示例中,第一列同时显示数据的Region字段值。因此,当年展开导航树节点时,每个树节点标签与对应数据行中的Region字段值一致。对于树的叶子节点,数据源没有包含Region字段值。所有叶子节点标签为空。
您可以将导航树独自放置在单独的列中,该列不和任意数据字段对应。如下所示:
该示例没有任何数据字段与将包含数列对应,所有树图标显示为无标签。该示例同时设置folderClosedIcon、folderOpenIcon、和defaultLeafIcon属性为null,但是disclosure图标被显示以使得用户可以打开或关闭树节点。
以下代码实现该示例:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleHierarchicalData.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid width="100%" height="100%"
folderClosedIcon="{null}"
folderOpenIcon="{null}"
defaultLeafIcon="{null}">
<mx:dataProvider>
<mx:HierarchicalData source="{dpHierarchy}"/>
</mx:dataProvider>
<mx:columns>
<mx:AdvancedDataGridColumn headerText="" width="50"/>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
显示分层数据
分层数据是数据被分层组织的结构化数据。要在AdvancedDataGrid控件中显示分层数据,您需要将控件的数据源设置为HierarchicalData类的实例。数据源中的数据结构定义了AdvancedDataGrid控件对数据的如何显示。
使用ArrayCollection定义分层数据
正如下面示例中SimpleHierarchicalData.as文件显示的,使用ArrayCollection是创建分层数据的常用方式。在该示例中,数据有三个层次,一个跟层次和两个子层次:
[Bindable]
private var dpHierarchy:ArrayCollection = new ArrayCollection([
{Region:"Southwest", children: [
{Region:"Arizona", children: [
{Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]},
{Region:"Central California", children: [
{Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]},
{Region:"Nevada", children: [
{Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]},
{Region:"Northern California", children: [
{Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]},
{Region:"Southern California", children: [
{Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
]}
]);
该示例在ArrayCollection定义中使用children关键字来定义数据的层次。children关键字是HierarchicalData类用来定义层次的缺省关键字。
您也可以使用使用其他的关键字来定义层次。以下示例显示HierarchicalDataCategories.as文件内容,其使用的是categories关键字:
[Bindable]
private var dpHierarchy:ArrayCollection = new ArrayCollection([
{Region:"Southwest", categories: [
{Region:"Arizona", categories: [
{Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]},
{Region:"Central California", categories: [
{Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]},
{Region:"Nevada", categories: [
{Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]},
{Region:"Northern California", categories: [
{Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]},
{Region:"Southern California", categories: [
{Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
]}
]);
如下所示,使用HierarchicalData.childrenField属性来指定定义层级的字段名:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "HierarchicalDataCategories.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid width="100%" height="100%">
<mx:dataProvider>
<mx:HierarchicalData source="{dpHierarchy}"
childrenField="categories"/>
</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:columns>
</mx:AdvancedDataGrid>
</mx:Application>
前面章节的示例中使用ArrayCollection来创建AdvancedDataGrid控件。您也可以使用分层 XML数据来创建AdvancedDataGrid控件。以下示例修改前面章节的数据格式化为XML,然后将数据传递给AdvancedDataGrid 控件:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.HierarchicalData;
import mx.collections.XMLListCollection;
]]>
</mx:Script>
<mx:XMLList id="dpHierarchyXML" >
<Region Region="Southwest">
<Region Region="Arizona">
<Territory_Rep Territory_Rep="Barbara Jennings"
Actual="38865" Estimate="40000"/>
<Territory_Rep Territory_Rep="Dana Binn"
Actual="29885" Estimate="30000"/>
</Region>
<Region Region="Central California">
<Territory_Rep Territory_Rep="Joe Smith"
Actual="29134" Estimate="30000"/>
</Region>
<Region Region="Nevada">
<Territory_Rep Territory_Rep="Bethany Pittman"
Actual="52888" Estimate="45000"/>
</Region>
<Region Region="Northern California">
<Territory_Rep Territory_Rep="Lauren Ipsum"
Actual="38805" Estimate="40000"/>
<Territory_Rep Territory_Rep="T.R. Smith"
Actual="55498" Estimate="40000"/>
</Region>
<Region Region="Southern California">
<Territory_Rep Territory_Rep="Alice Treu"
Actual="44985" Estimate="45000"/>
<Territory_Rep Territory_Rep="Jane Grove"
Actual="44913" Estimate="45000"/>
</Region>
</Region>
</mx:XMLList>
<mx:AdvancedDataGrid width="100%" height="100%"
dataProvider="{new HierarchicalData(dpHierarchyXML)}">
<mx:columns>
<mx:AdvancedDataGridColumn dataField="@Region"
headerText="Region"/>
<mx:AdvancedDataGridColumn dataField="@Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumn dataField="@Actual"
headerText="Actual"/>
<mx:AdvancedDataGridColumn dataField="@Estimate"
headerText="Estimate"/>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
显示分组数据
分组数据是组织为同一层次以在AdvancedDataGrid控件中显示的扁平数据。要分组您的数据,您要指定一个更多的字段来将数据归集为同一层次下。
要使用分组数据来生成AdvancedDataGrid控件,您需要从您的扁平数据中创建一个 GroupingCollection类的实例,然后将该GroupingCollection实例作为数据源传递给AdvancedDataGrid控 件。当年从扁平数据创建一个GroupingCollection类的实例时,您需要指定数据中的那些字段用于创建层次。
本节中大部份示例使用如下扁平数据来创建GroupingCollection类的实例:
[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:"Southwest", Territory:"Northern California",
Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}
]);
以下示例使用该数据:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as"
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
initialize="gc.refresh();">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dpFlat}">
<mx:grouping>
<mx:Grouping>
<mx:GroupingField name="Region"/>
<mx:GroupingField name="Territory"/>
</mx:Grouping>
</mx:grouping>
</mx:GroupingCollection>
</mx:dataProvider>
<mx:columns>
<mx:AdvancedDataGridColumn dataField="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:Application>
上面的示例中使用俩个字段来分组数据:Region和Territory。
GroupingCollection实例实际上基于这些字段重新格式化数据以作为GroupingCollection实例的内部数据表示,如下所示:
[{GroupLabel:"Southwest", children:[
{GroupLabel:"Arizona", children:[
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]}
{GroupLabel:"Central California", children:[
{Region:"Southwest", Territory:"Central California",
Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]}
{GroupLabel:"Nevada", children:[
{Region:"Southwest", Territory:"Nevada",
Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]}
{GroupLabel:"Northern California", children:[
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]}
{GroupLabel:"Southern California", children:[
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
]}]
注意该表示的为基于扁平数据的Region和Territory字段的数据分层结构,该 GroupingCollection实例同样包含输入的扁平数据的原始行,但是这些行被基于分组字段组织为分层结构。缺省的被用来从扁平数据创建层次结 构的数据字段名是GroupLabel。您可以使用Grouping.label属性来指定不同的名字。
AdvancedDataGrid控件使用GroupLabel字段定义导航树分支节点的标签。AdvancedDataGrid控件的第一列同样与Region字段相对应。所以导航树使用Region字段来定义树叶子节点的标签。
grouping属性是GroupingCollection类的缺省MXML属性,所以您可以如下重写前面的示例:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as"
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
initialize="gc.refresh();">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dpFlat}">
<mx:grouping>
<mx:GroupingField name="Region"/>
<mx:GroupingField name="Territory"/>
</mx:grouping>
</mx:GroupingCollection>
</mx:dataProvider>
<mx:columns>
<mx:AdvancedDataGridColumn dataField="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:Application>
调用GroupingCollection.refresh()方法
GroupingCollection.refresh()方法将GroupingCollection类的设置应用到 数据中。您必须在任何时候您通过设置GroupingCollection类的grouping、 source或summaries属性修改了GroupingCollection类时调用该方法。
为GroupLabel字段创建列
显示分组数据时可选地可以为分组字段生成的顶层条目创建一个单独列。例如,您使用Region和Territory字段来对扁平数据进行分组,这些字段被作为分支节点的标签显示在导航树上,所以您为这些列省去了单独的列,如下所示:
以下代码创建该示例。注意该示例为GroupLabel字段包含了一个AdvancedDataGridColumn实例。对于Region和Territory没有定义列:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
defaultLeafIcon="{null}"
initialize="gc.refresh();">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dpFlat}">
<mx:Grouping>
<mx:GroupingField name="Region"/>
<mx:GroupingField name="Territory"/>
</mx:Grouping>
</mx:GroupingCollection>
</mx:dataProvider>
<mx:columns>
<mx:AdvancedDataGridColumn dataField="GroupLabel"
headerText="Region/Territory"/>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
创建汇总行
您可以使用GroupingField类的summaries属性来创建分组数据的汇总数据,然后您可以将汇总数据与原来数据显示同一行中,也可以将其显示在单独一行中。
以下示例中,AdvancedDataGrid控件显示了两个汇总字段,Min Actual和Max Actual:
顶部行的Min Actual和Max Actual字段对应分组中所有行的汇总,而每个Territory的Min Actual和Max Actual字段对应该Territory子组中所有行的汇总。
以下是实际代码:
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as"
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
initialize="gc.refresh();">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dpFlat}">
<mx:Grouping>
<mx:GroupingField name="Region">
<mx:summaries>
<mx:SummaryRow summaryPlacement="group">
<mx:fields>
<mx:SummaryField dataField="Actual"
label="Min Actual" operation="MIN"/>
<mx:SummaryField dataField="Actual"
label="Max Actual" operation="MAX"/>
</mx:fields>
</mx:SummaryRow>
</mx:summaries>
</mx:GroupingField>
<mx:GroupingField name="Territory">
<mx:summaries>
<mx:SummaryRow summaryPlacement="group">
<mx:fields>
<mx:SummaryField dataField="Actual"
label="Min Actual" operation="MIN"/>
<mx:SummaryField dataField="Actual"
label="Max Actual" operation="MAX"/>
</mx:fields>
</mx:SummaryRow>
</mx:summaries>
</mx:GroupingField>
</mx:Grouping>
</mx:GroupingCollection>
</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 dataField="Min Actual"/>
<mx:AdvancedDataGridColumn dataField="Max Actual"/>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
注意在该示例中,我们将GroupingField.summaries属性指定为SummaryRow实例。 SummaryRow包含数据汇总的所有信息。例如,我们使用SummaryRow的summaryPlacement属性来将汇总数据添加到分组数据 中。可选的,您也可以增加一个新行来存放汇总数据。更多信息请查看“指定汇总数据存放位置“。
每个SummaryRow实例指定一个或多个用来创建数据汇总的SummayField实例。例如,您可以使用 SummayField的dataField属性来指定对Actual数据字段进行汇总,label属性用于指明存放汇总数据的数据字段的名称,而 operation属性用于指定如何对数值字段几行汇总,您可以使用以下任一值:SUM、MIN、 MAX、AVG或COUNT。
加上了新的合计数据字段,在组件内部,代表分组数据的GroupingCollection其内容如下所示:
[{GroupLabel:"Southwest", Max Actual:55498, Min Actual:29134, children:[
{GroupLabel:"Arizona", Max Actual:38865, Min Actual:29885, children:[
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000}]}
{GroupLabel:"Central California", Max Actual:29134, Min Actual:29134,children:[
{Region:"Southwest", Territory:"Central California",
Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000}]}
{GroupLabel:"Nevada", Max Actual:52888, Min Actual:52888, children:[
{Region:"Southwest", Territory:"Nevada",
Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000}]}
{GroupLabel:"Northern California", Max Actual:55498, Min Actual:38805,children:[
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000}]}
{GroupLabel:"Southern California", Max Actual:44985, Min Actual:44913,children:[
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000}]}
]}]
使用GroupingField和SummaryRow类的缺省属性
GroupingField.summaries属性是GroupingField的缺省属性,而SummaryRow.fields属性是 SummaryRow类的缺省属性;因此,您可以在您的代码中省略这些属性而重写前面的示例,如下所示:
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as"
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
initialize="gc.refresh();">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dpFlat}">
<mx:Grouping>
<mx:GroupingField name="Region">
<mx:SummaryRow summaryPlacement="group">
<mx:SummaryField operation="MIN"
dataField="Actual" label="Min Actual"/>
<mx:SummaryField operation="MAX"
dataField="Actual" label="Max Actual"/>
</mx:SummaryRow>
</mx:GroupingField>
<mx:GroupingField name="Territory">
<mx:SummaryRow summaryPlacement="group">
<mx:SummaryField operation="MIN"
dataField="Actual" label="Min Actual"/>
<mx:SummaryField operation="MAX"
dataField="Actual" label="Max Actual"/>
</mx:SummaryRow>
</mx:GroupingField>
</mx:Grouping>
</mx:GroupingCollection>
</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 dataField="Min Actual"/>
<mx:AdvancedDataGridColumn dataField="Max Actual"/>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
指定汇总数据存放位置
SummaryRow类包含一个summaryPlacement属性用于决定在AdvancedDataGrid控件的那里显示汇总数据。summaryPlacement属性允许的值如下:
- first 在分组的第一行创建汇总行。
- last 在分组的最后一行创建汇总行。
- group 将合计数据添加到对应的分组中。
在前面的“创建汇总中”小节中的示例已经演示了通过指定summaryPlacement属性值为group来将汇总数据添加到分组中。以下示例,使用相同的分组数据但是其summaryPlacement属性设置的是last:
您可以指定多个值给summaryPlacement属性,通过空格分隔,例如,指定“last group”这样的值表示同时在分组级别和分组的末行显示汇总数据。
这样,加上了新的合计数据字段,在组件内部,代表分组数据的GroupingCollection其内容如下所示:
[{GroupLabel:"Southwest", children:[
{GroupLabel:"Arizona", children:[
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Barbara Jennings", Actual:38865, Estimate:40000},
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Dana Binn", Actual:29885, Estimate:30000},
{Max Actual:38865, Min Actual:29885}]}
{GroupLabel:"Central California", children:[
{Region:"Southwest", Territory:"Central California",
Territory_Rep:"Joe Smith", Actual:29134, Estimate:30000},
{Max Actual:29134, Min Actual:29134}]}
{GroupLabel:"Nevada", children:[
{Region:"Southwest", Territory:"Nevada",
Territory_Rep:"Bethany Pittman", Actual:52888, Estimate:45000},
{Max Actual:52888, Min Actual:52888}]}
{GroupLabel:"Northern California", children:[
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"Lauren Ipsum", Actual:38805, Estimate:40000},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"T.R. Smith", Actual:55498, Estimate:40000},
{Max Actual:55498, Min Actual:38805}]}
{GroupLabel:"Southern California", children:[
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Alice Treu", Actual:44985, Estimate:45000},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Jane Grove", Actual:44913, Estimate:45000},
{Max Actual:44985, Min Actual:44913}]}
{Max Actual:55498, Min Actual:29134}
]}]
注意,在整个组中添加了一个新行用于存放汇总数据,而且每个子组都添加了一个新行用于存放子组的汇总数据。
您可以在单个GroupingField实例中指定多个SummaryRow实例。在下面的示例中,我们定义如下字段为Region组创建汇总数据:Min Actual、Max Actual、Min Estimate和Max Estimate:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as"
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
initialize="gc.refresh();">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dpFlat}">
<mx:Grouping>
<mx:GroupingField name="Region">
<mx:SummaryRow summaryPlacement="group">
<mx:SummaryField operation="MIN"
dataField="Actual" label="Min Actual"/>
<mx:SummaryField operation="MAX"
dataField="Actual" label="Max Actual"/>
</mx:SummaryRow>
<mx:SummaryRow summaryPlacement="group">
<mx:SummaryField operation="MIN"
dataField="Estimate" label="Min Estimate"/>
<mx:SummaryField operation="MAX"
dataField="Estimate" label="Max Estimate"/>
</mx:SummaryRow>
</mx:GroupingField>
<mx:GroupingField name="Territory"/>
</mx:Grouping>
</mx:GroupingCollection>
</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 dataField="Min Actual"/>
<mx:AdvancedDataGridColumn dataField="Max Actual"/>
<mx:AdvancedDataGridColumn dataField="Min Estimate"/>
<mx:AdvancedDataGridColumn dataField="Max Estimate"/>
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>
创建列分组
您可以使用列分组将多列归集到一个单一列表头下,如下所示:
在该示例中,您可以提供给数据表格以扁平数据,然后对Actual和Estimate列归组到一个单一的名称为Revenues的列中。
要在一个AdvancedDataGrid控件中进行列分组,您必须如下做:
- 使用AdvancedDataGrid.groupedColumns属性而不是AdvancedDataGrid.columns属性来标识列。
- 使用AdvancedDataGridColumnGroup来指定分组。
下面是前面示意图中的AdvancedDataGrid控件的代码实现:
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
dataProvider="{dpFlat}"
width="100%" height="100%">
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory"/>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumnGroup headerText="Revenues">
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:AdvancedDataGridColumnGroup>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
</mx:Application>
groupedColumns属性包括AdvancedDataGridColumn类和 AdvancedDataGridColumnGroup类的实例。AdvancedDataGridColumn类的实例在控件中显示为单独的一列。而 所有在AdvancedDataGridColumnGroup实例中指定的列将作为已分组的列显示在一起。
您可以给控件添加多个分组,下面的示例增加名称为Area和Revenue的两个分组:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
dataProvider="{dpFlat}"
width="100%" height="100%">
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumnGroup headerText="Area">
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory"/>
</mx:AdvancedDataGridColumnGroup>
<mx:AdvancedDataGridColumnGroup headerText="Revenues">
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:AdvancedDataGridColumnGroup>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
</mx:Application>
您还可以将分组嵌套以让一个分组列包含多个分组,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "SimpleFlatData.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
dataProvider="{dpFlat}"
width="100%" height="100%">
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumnGroup headerText="All Groups">
<mx:AdvancedDataGridColumnGroup headerText="Area">
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory"/>
</mx:AdvancedDataGridColumnGroup>
<mx:AdvancedDataGridColumnGroup headerText="Revenues">
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:AdvancedDataGridColumnGroup>
</mx:AdvancedDataGridColumnGroup>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
</mx:Application>
在分组中拖放列
By default, you can drag the columns in a group within the group to reposition them. You can also drag the entire group to reposition it in the AdvancedDataGrid control. 默认情况下,您可以拖动分组中的各列以在分组中重新放置它们。您也可以拖动整个分组以在AdvancedDataGrid控件中重新放置它们。
要禁用某一分组中所有列的拖动,设置AdvancedDataGridColumnGroup.childrenDragEnabled属性为false。要禁用单个列的拖动,设置AdvancedDataGridColumn.dragEnabled属性为false。
和扁平数据一样,您使用分层数据进行列分组,以下例子修改自“为导航树创建单独的列“章节中的示例以将Actual和Estimates列归组到Revenues组列中:
<?xml version="1.0" encoding="utf-8"?>
<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:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumnGroup headerText="Revenues">
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:AdvancedDataGridColumnGroup>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
</mx:Application>
上面的列分组示例中并没有为AdvancedDataGridColumnGroup类指定数据字段,但 是,AdvancedDataGridColumnGroup类就是被设计用于和分层数据一起工作的。因此,如果您给 AdvancedDataGridColumnGroup类指定一个数据字段的话,它将自动给该数据字段的子字段创建一个列分组。
在下面示例中,HierarchicalDataForGroupedColumns.as文件定义了一个分层数据,设置Revenues字段包含俩个子字段,Actual 和Estimate:
[Bindable]
private var dpHierarchy:ArrayCollection = new ArrayCollection([
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Barbara Jennings",
Revenues:{Actual:38865, Estimate:40000}},
{Region:"Southwest", Territory:"Arizona",
Territory_Rep:"Dana Binn",
Revenues:{Actual:29885, Estimate:30000}},
{Region:"Southwest", Territory:"Central California",
Territory_Rep:"Joe Smith",
Revenues:{Actual:29134, Estimate:30000}},
{Region:"Southwest", Territory:"Nevada",
Territory_Rep:"Bethany Pittman",
Revenues:{Actual:52888, Estimate:45000}},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"Lauren Ipsum",
Revenues:{Actual:38805, Estimate:40000}},
{Region:"Southwest", Territory:"Northern California",
Territory_Rep:"T.R. Smith",
Revenues:{Actual:55498, Estimate:40000}},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Alice Treu",
Revenues:{Actual:44985, Estimate:45000}},
{Region:"Southwest", Territory:"Southern California",
Territory_Rep:"Jane Grove",
Revenues:{Actual:44913, Estimate:45000}}
]);
下面示例使用该数据并且指定Revenues字段为AdvancedDataGridColumnGroup.dataField属性的值,其输出如下:
以下是实现代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
include "HierarchicalDataForGroupedColumns.as";
]]>
</mx:Script>
<mx:AdvancedDataGrid id="myADG"
width="100%" height="100%"
defaultLeafIcon="{null}">
<mx:dataProvider>
<mx:HierarchicalData source="{dpHierarchy}"/>
</mx:dataProvider>
<mx:groupedColumns>
<mx:AdvancedDataGridColumn dataField="Region"/>
<mx:AdvancedDataGridColumn dataField="Territory"/>
<mx:AdvancedDataGridColumn dataField="Territory_Rep"
headerText="Territory Rep"/>
<mx:AdvancedDataGridColumnGroup dataField="Revenues">
<mx:AdvancedDataGridColumn dataField="Actual"/>
<mx:AdvancedDataGridColumn dataField="Estimate"/>
</mx:AdvancedDataGridColumnGroup>
</mx:groupedColumns>
</mx:AdvancedDataGrid>
</mx:Application>
在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类中您可以用来配置渲染器的属性的描述:
属性 |
描述 |
---|---|
|
使用渲染器的列的ID。如果您省略该属性,您可以使用 |
|
使用渲染器的列索引,第一列的索引为0。 |
|
渲染器跨越的列数目。设置该属性为0表示横跨所有的列。缺省值为1。 |
|
给渲染器使用的数据源中的数据字段。该属性可选。 |
|
在树的哪个深度使用渲染器,树的最顶级节点的深度为1。当只在树被展开到特定深度而不是在树中所有的节点使用渲染器时使用该属性。缺省情况下,该控件在树的所有级别使用渲染器。 |
|
渲染器。 |
|
渲染器跨越的行数,缺省值为1。 |
使用渲染器生成列数据
下面示例使用一个项目渲染器来计算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", region: "Arizona", 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", region: "California", 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", region: "Arizona", total:70, children:[ {detail:[{amount:5},{amount:10},{amount:20},{amount:45}]}]}, {name:"Dana Binn", region: "Arizona", 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", region: "California", 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: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的使用》到此完成,本介绍其他部分:
- Flex 3 发现之旅:AdvancedDataGrid的使用(第一部分)
- Flex 3 发现之旅:AdvancedDataGrid的使用(第二部分)
- Flex 3 发现之旅:AdvancedDataGrid的使用(第三部分)
另外,完整的《AdvancedDataGrid的使用》已经发布到了FlexWiki,这里我们再次邀请各位朋友加入到我们的FlexWiki计划中来,更多信息请访问:wiki.flexsearch.cn