|
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
.
|
|
|