使用 ActionScript

通过在 Array 或 XML 对象中创建数据并将该对象作为 value 参数提供给 DataProvider 构造函数,可以创建 DataProvider。

注意

在 ActionScript 3.0 中,无法直接将 Array 或 XML 对象赋给 dataProvider 属性,原因是此属性定义为 DataProvider 对象,因而只能接收 DataProvider 类型的对象。

下面的示例用若干孩子的姓名及生日填充由仅包含一列的若干行组成的 List 组件。此示例在 items Array 中定义此列表,并在创建 DataProvider 实例 (new DataProvider(items)) 时将它作为参数提供,从而将它赋给此 List 组件的 dataProvider 属性。

import fl.controls.List;
import fl.data.DataProvider;

var aList:List = new List();
var items:Array = [
{label:"David", data:"11/19/1995"},
{label:"Colleen", data:"4/20/1993"},
{label:"Sharon", data:"9/06/1997"},
{label:"Ronnie", data:"7/6/1993"},
{label:"James", data:"2/15/1994"},
];
aList.dataProvider = new DataProvider(items);
addChild(aList);
aList.move(150,150);

Array 由若干对标签和值字段组成。标签字段为 labeldata,值字段为孩子的姓名及生日。标签字段标识 List 中显示的内容,在本例中即为孩子的姓名。产生的 List 如下所示:

用 DataProvider 提供的数据填充的 List

由 DataProvider 填充的 List


当用户选择列表中的某一项目(通过单击该项目,此时会引发 change 事件)时可以使用数据字段的值。下面的示例向上一示例添加一个 TextArea (aTa) 和一个事件处理函数 (changeHandler),以便在用户选择此 List 中的某一姓名时显示此孩子的生日。

import fl.controls.List;
import fl.controls.TextArea;
import flash.events.Event;
import fl.data.DataProvider;

var aList:List = new List();
var aTa:TextArea = new TextArea();
var items:Array = [
{label:"David", data:"1/19/1995"},
{label:"Colleen", data:"4/20/1993"},
{label:"Sharon", data:"9/06/1994"},
{label:"Ronnie", data:"7/6/1993"},
{label:"James", data:"2/15/1994"},
];
aList.dataProvider = new DataProvider(items);

addChild(aList);
addChild(aTa);

aList.move(150,150);
aTa.move(150, 260);

aList.addEventListener(Event.CHANGE, changeHandler);

function changeHandler(event:Event):void {
    aTa.text = event.target.selectedItem.data;
};

现在,如果用户选择此 List 中某个孩子的姓名,此孩子的生日就会显示在此 TextArea 中,如下图所示。changeHandler() 函数将此 TextArea (aTa.text) 的 text 属性设置为所选项目中的数据字段 (event.target.selectedItem.data) 的值,从而实现此过程。event.target 属性是触发此事件的对象,在本例中即为此 List。

显示数据(数据由 List 的 DataProvider 的数据字段提供)的 TextArea。

显示 List 的 DataProvider 中的数据字段


可以将非文本数据包含在 DataProvider 中。下面的示例将 MovieClip 包含在为 TileList 提供数据的 DataProvider 中。它在创建 MovieClip(一个带颜色的框)之后,通过调用 addItem() 添加每个项目来构建 DataProvider。

import fl.data.DataProvider;
import flash.display.DisplayObject;

var aBox:MovieClip = new MovieClip();
var i:uint = 0;
var colors:Array = new Array(0x00000, 0xFF0000, 0x0000CC, 0x00CC00, 0xFFFF00);
var colorNames:Array = new Array("Midnight", "Cranberry", "Sky", "Forest", "July");
var dp:DataProvider = new DataProvider();
for(i=0; i < colors.length; i++) {
    drawBox(aBox, colors[i]);    // draw box w next color in array
    dp.addItem( {label:colorNames[i], source:aBox} );
}
aTl.dataProvider = dp;
aTl.columnWidth = 110;
aTl.rowHeight = 130;
aTl.setSize(280,150);
aTl.move(150, 150);
aTl.setStyle("contentPadding", 5);

function drawBox(box:MovieClip,color:uint):void {
            box.graphics.beginFill(color, 1.0);
            box.graphics.drawRect(0, 0, 100, 100);
            box.graphics.endFill();        

也可以使用 XML 数据(而非数组)来填充 DataProvider 对象。例如,下面的代码将数据存储在一个名为 employeesXML 的 XML 对象中,然后将该对象传递给 DataProvider() 构造函数的 value 参数:

import fl.controls.DataGrid;
import fl.data.DataProvider;

var aDg:DataGrid = new DataGrid();
addChild(aDg);

var employeesXML:XML = 
    <employees>
        <employee Name="Edna" ID="22" />
        <employee Name="Stu" ID="23" />
    </employees>;

var myDP:DataProvider = new DataProvider(employeesXML);

aDg.columns = ["Name", "ID"];
aDg.dataProvider = myDP;

可以将数据作为 XML 数据的属性 (attribute) 提供,如上一段代码所示;也可以将数据作为 XML 数据的属性 (property) 提供,如下面的代码所示:

var employeesXML:XML = 
    <employees>
        <employee>
            <Name>Edna</Name>
            <ID>22</ID>
        </employee>
        <employee>
            <Name>Stu</Name>
            <ID>23</ID>
        </employee>
    </employees>;

DataProvider 还有一组用来访问和操作它的方法和属性。可以使用 DataProvider API 在 DataProvider 中添加项目、删除项目、替换项目、对项目排序以及合并项目。