Arbeta med en DataProvider

En DataProvider är en datakälla som du kan använda för att förse komponenterna ComboBox, DataGrid, List och TileList med data. Var och en av de här klasserna har en dataProvider -egenskap som du tilldelar ett DataProvider-objekt för att fylla i komponentens celler med data. Vanligtvis är en DataProvider en uppsättning med data, till exempel ett Array- eller XML-objekt.

Skapa en DataProvider

För komponenterna ComboBox, List och TileList kan du skapa en DataProvider med parametern dataProvider i utvecklingsmiljön. Komponenten DataGrid har ingen dataProvider-parameter i egenskapsinspektören eftersom den kan ha flera kolumner, och dess DataProvider är därför mer komplex. Du kan också använda ActionScript för att skapa en DataProvider för de här komponenterna och för DataGrid.

Använda parametern DataProvider

Du skapar en enkel DataProvider för komponenterna ComboBox, List och TileList genom att klicka på parametern dataProvider på fliken Parametrar i egenskapsinspektören eller komponentinspektören.

Om du dubbelklickar på värdecellen, som till att börja med visar en tom Array, öppnas dialogrutan Värden, där du kan ange flera etiketts- och datavärden för att skapa en DataProvider.

dialogrutan Värden för dataProvider

Klicka på plustecknet och lägg till ett objekt i dataProvider. Klicka på minustecknet om du vill ta bort ett objekt. Klicka på uppåtpilen för att flytta ett markerat objekt uppåt i listan, eller på nedåtpilen för att flytta ett markerat objekt nedåt i listan. I följande bild visas dialogrutan Värden som skapar en lista med barns namn och födelsedagar.

dialogrutan Värden med data

Den Array som du skapar består av par med etikett- och värdefält. Etikettfälten är label och data och värdefälten är barnens namn och födelsedagar. Etikettfältet identifierar innehållet som visas i List, i det här fallet barnens namn. Den ComboBox som blir resultatet ser ut så här:

En ComboBox ifylld av DataProvider

När du har lagt till alla data klickar du på OK för att stänga dialogrutan. Den Array som finns i parametern dataProvider har nu fyllts i med objekten som du skapade.

Parametern dataProvider med data

Du kan komma åt label- och datavärdena som du skapade genom att använda ActionScript för att komma åt komponentens dataProvider -egenskap.

Skapa en DataProvider med ActionScript

Du kan skapa en DataProvider genom att skapa data i ett Array- eller XML-objekt och tillhandhålla objektet som parametern value för DataProvider-konstruktorn.

Obs! I ActionScript 3.0 kan du inte tilldela ett Array- eller XML-objekt direkt till en dataProvider-egenskap, eftersom egenskapen är definierad som ett DataProvider-objekt, och bara kan ta emot ett objekt av typen DataProvider.

Följande exempel fyller i en List-komponent, som är en enda rad kolumn med rader, med namnen på flera barn och deras födelsedagar. Exemplet definierar listan i en items -Array och anger den som parameter när den skapar DataProvider-förekomsten ( ny DataProvider(objekt) ) och tilldelar den egenskapen dataProvider för List-komponenten.

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);

Denna Array består av par med etikett- och värdefält. Etikettfälten är label och data och värdefälten är barnens namn och födelsedagar. Etikettfältet identifierar innehållet som visas i List, i det här fallet barnens namn. Den List som blir resultatet ser ut så här:

En List ifylld av en DataProvider

Värdet på datafältet är tillgängligt när användaren markerar ett objekt i listan genom att klicka på det, vilket orsakar en change -händelse. Följande exempel lägger till en TextArea ( aTa ) och en händelsehanterare ( changeHandler ) i föregående exempel för att visa barnets födelsedag när en användare markerar ett namn i 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; 
};

När en användare nu markerar ett barns namn i List visas barnets födelsedag i TextArea, så som visas i följande bild. Det åstadkoms av funktionen changeHandler() när den ställer in värdet på datafältet i det markerade objektet ( event.target.selectedItem.data ) för text -egenskapen för TextArea ( aTa.text ) . Egenskapen event.target är det objekt som utlöste händelsen, i det här fallet List.

Visa datafältet från DataProvider för en List

Du kan ta med andra data än text i en DataProvider. I följande exempel tas filmklipp med i en DataProvider som förser en TileList med data. I exemplet byggs DataProvider genom att addItem() anropas för att lägga till varje objekt när filmklippet, en färglagd ruta, har skapats.

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();        

Du kan också använda XML-data (i stället för en array) om du vill fylla i ett DataProvider-objekt. Följande kod lagrar till exempel data i ett XML-objekt som heter employeesXML , och skickar sedan objektet som värdeparametern för konstruktorfunktionen DataProvider() :

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;

Du kan tillhandahålla data som attribut till XML-data, som i föregående kod, eller som egenskaper för XML-data, som i följande kod:

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

DataProvider har också en uppsättning metoder och egenskaper som gör att du kan komma åt och ändra den. Du kan använda DataProvider-API för att lägga till, ta bort, byta ut, sortera och sammanfoga objekt i en DataProvider.

Ändra en DataProvider

Du kan lägga till objekt i en DataProvider med metoderna addItem() och addItemAt() . I följande exempel läggs objekt till som en användare anger i textfältet i en redigerbar ComboBox. Det förutsätts att en ComboBox har dragits in på scenen och har fått namnet aCb .

import fl.data.DataProvider; 
import fl.events.ComponentEvent; 
 
var items:Array = [ 
{label:"Roger"}, 
{label:"Carolyn"}, 
{label:"Darrell"}, 
{label:"Rebecca"}, 
{label:"Natalie"}, 
{label:"Mitchell"}, 
]; 
aCb.dataProvider = new DataProvider(items); 
     
aCb.addEventListener(ComponentEvent.ENTER, newItemHandler); 
 
function newItemHandler(event:ComponentEvent):void { 
    var newRow:int = event.target.length + 1; 
        event.target.addItemAt({label:event.target.selectedLabel}, 
        event.target.length); 
}

Du kan också byta ut och ta bort objekt i en komponent via dess DataProvider. Följande exempel implementerar två separata List-komponenter, listA och listB , och tillhandahåller en Button med etiketten Sync. När en användare klickar på denna Button använder exemplet metoden replaceItemAt() för att byta ut objekten i listB mot objekten i listA . Om listA är längre än listB anropar exemplet metoden addItem() för att lägga till de extra objekten i listB . Om listB är längre än listA anropar exemplet metoden removeItemAt() för att ta bort de extra objekten i ListB .

// Requires the List and Button components to be in the library 
 
import fl.controls.List; 
import fl.controls.Button; 
import flash.events.Event; 
import fl.data.DataProvider; 
 
var listA:List = new List(); 
var listB:List = new List(); 
var syncButton:Button = new Button(); 
syncButton.label = "Sync"; 
 
var itemsA:Array = [ 
{label:"David"}, 
{label:"Colleen"}, 
{label:"Sharon"}, 
{label:"Ronnie"}, 
{label:"James"}, 
]; 
var itemsB:Array = [ 
{label:"Roger"}, 
{label:"Carolyn"}, 
{label:"Darrell"}, 
{label:"Rebecca"}, 
{label:"Natalie"}, 
{label:"Mitchell"}, 
]; 
listA.dataProvider = new DataProvider(itemsA); 
listB.dataProvider = new DataProvider(itemsB); 
 
addChild(listA); 
addChild(listB); 
addChild(syncButton); 
 
listA.move(100, 100); 
listB.move(250, 100); 
syncButton.move(175, 220); 
 
syncButton.addEventListener(MouseEvent.CLICK, syncHandler); 
 
function syncHandler(event:MouseEvent):void { 
    var i:uint = 0; 
    if(listA.length > listB.length) {     //if listA is longer, add items to B 
        while(i < listB.length) { 
            listB.dataProvider.replaceItemAt(listA.dataProvider.getItemAt(i), i); 
            ++i; 
        } 
        while(i < listA.length) { 
            listB.dataProvider.addItem(listA.dataProvider.getItemAt(i++)); 
        } 
    } else if(listA.length == listB.length) { //if listA and listB are equal length 
        while(i < listB.length) { 
            listB.dataProvider.replaceItemAt(listA.dataProvider.getItemAt(i), i); 
            ++i; 
        } 
    } else {                //if listB is longer, remove extra items from B 
        while(i < listA.length) { 
            listB.dataProvider.replaceItemAt(listA.dataProvider.getItemAt(i), i); 
            ++i; 
        } 
        while(i < listB.length) { 
            listB.dataProvider.removeItemAt(i++); 
        } 
    } 
}

Du kan också sammanfoga med och sortera en DataProvider med metoderna merge() , sort() och sortOn() . Följande exempel fyller i två DataGrid-förekomster ( aDg och bDg ) med delvisa spelarlistor för två fotbollslag. En Button med etiketten Merge läggs till, och när användaren klickar på den sammanfogar händelsehanteraren ( mrgHandler ) spelarlistan för bDg med spelarlistan för aDg och sorterar den DataGrid som blir resultatet i namnkolumnen.

import fl.data.DataProvider; 
import fl.controls.DataGrid; 
import fl.controls.Button; 
 
var aDg:DataGrid = new DataGrid(); 
var bDg:DataGrid = new DataGrid(); 
var mrgButton:Button = new Button(); 
addChild(aDg); 
addChild(bDg); 
addChild(mrgButton); 
bldRosterGrid(aDg); 
bldRosterGrid(bDg); 
var aRoster:Array = new Array(); 
var bRoster:Array = new Array(); 
aRoster = [ 
        {Name:"Wilma Carter", Bats:"R", Throws:"R", Year:"So", Home: "Redlands, CA"},  
        {Name:"Sue Pennypacker", Bats:"L", Throws:"R", Year:"Fr", Home: "Athens, GA"}, 
        {Name:"Jill Smithfield", Bats:"R", Throws:"L", Year:"Sr", Home: "Spokane, WA"}, 
        {Name:"Shirley Goth", Bats:"R", Throws:"R", Year:"Sr", Home: "Carson, NV"} 
]; 
bRoster = [ 
        {Name:"Angelina Davis", Bats:"R", Throws:"R", Year:"So", Home: "Odessa, TX"}, 
        {Name:"Maria Santiago", Bats:"L", Throws:"L", Year:"Sr", Home: "Tacoma, WA"}, 
        {Name:"Debbie Ferguson", Bats:"R", Throws:"R", Year: "Jr", Home: "Bend, OR"} 
]; 
aDg.dataProvider = new DataProvider(aRoster); 
bDg.dataProvider = new DataProvider(bRoster); 
aDg.move(50,50); 
aDg.rowCount = aDg.length; 
bDg.move(50,200); 
bDg.rowCount = bDg.length; 
mrgButton.label = "Merge"; 
mrgButton.move(200, 315); 
mrgButton.addEventListener(MouseEvent.CLICK, mrgHandler); 
 
function bldRosterGrid(dg:DataGrid){ 
    dg.setSize(400, 300); 
    dg.columns = ["Name", "Bats", "Throws", "Year", "Home"]; 
    dg.columns[0].width = 120; 
    dg.columns[1].width = 50; 
    dg.columns[2].width = 50; 
    dg.columns[3].width = 40; 
    dg.columns[4].width = 120; 
}; 
 
function mrgHandler(event:MouseEvent):void { 
    aDg.dataProvider.merge(bDg.dataProvider); 
    aDg.dataProvider.sortOn("Name"); 
}

Mer information finns i DataProvider-klassen i Referenshandbok för ActionScript 3.0 .