Een DataProvider is een gegevensbron die u kunt gebruiken om gegevens op te geven in de componenten ComboBox, DataGrid, List en TileList. Elk van deze componentklassen heeft de eigenschap
dataProvider
waaraan u een DataProvider-object kunt toewijzen om de cellen van de component te vullen met gegevens. Doorgaans bestaat een gegevensaanbieder uit een verzameling gegevens, zoals een Array- of XML-object.
Een DataProvider maken
Voor de componenten ComboBox, List en TileList kunt u in de ontwerpomgeving een DataProvider maken met de parameter
dataProvider
. In Eigenschapcontrole is voor de component DataGrid de eigenschap dataProvider niet opgenomen omdat deze component meerdere kolommen kan bevatten en de gegevensaanbieder daarom complexer is. U kunt ook ActionScript gebruiken om een DataProvider voor deze componenten en voor de component DataGrid te maken.
De parameter dataProvider gebruiken
U kunt een eenvoudige gegevensaanbieder voor de componenten ComboBox, List en TileList maken door op de parameter dataProvider te klikken op het tabblad Parameters van Eigenschapcontrole of Componentcontrole.
Als u dubbelklikt op de waardecel, waarin eerst een lege array wordt weergegeven, opent u het dialoogvenster Waarden waarin u meerdere label- en gegevenswaarden kunt invoeren om de gegevensaanbieder te maken.
Dialoogvenster Waarden voor dataProvider
Klik op het plusteken om een item toe te voegen aan de parameter dataProvider. Klik op het minteken om een item te verwijderen. Klik op de pijl-omhoog of pijl-omlaag om een geselecteerd item naar boven of beneden te verplaatsen in de lijst. In de volgende afbeelding wordt het dialoogvenster Waarden weergegeven waarin een lijst met namen en verjaardagen van kinderen wordt gemaakt.
Dialoogvenster Waarden met gegevens
De array die u maakt, bestaat uit paren label- en waardevelden. De labelvelden zijn
label
en
data
, en in de waardevelden worden de namen en verjaardagen van de kinderen weergegeven. In het labelveld wordt aangegeven welke inhoud wordt weergegeven in de lijst, in dit geval de namen van de kinderen. De resulterende ComboBox ziet er zo uit:
De ComboBox die is gevuld door de DataProvider
Wanneer u de gegevens hebt toegevoegd, klikt u op OK om het dialoogvenster te sluiten. De array in de parameter dataProvider wordt nu gevuld met de items die u hebt gemaakt.
Parameter dataProvider met gegevens
U kunt de gemaakte label- en gegevenswaarden openen door met ActionScript de eigenschap
dataProvider
van de component te openen.
Een DataProvider maken met ActionScript
U kunt een DataProvider maken door de gegevens in een Array- of XML-object te maken en het object op te geven als de parameter
value
voor de DataProvider-constructor.
Opmerking:
In ActionScript 3.0 kunt u een Array- of XML-object niet rechtstreeks aan de eigenschap dataProvider toewijzen omdat de eigenschap wordt gedefinieerd als een DataProvider-object en alleen een object van het type DataProvider kan ontvangen.
In het volgende voorbeeld wordt een component List, één kolom met rijen, gevuld met de namen van verschillende kinderen en hun verjaardagen. In het voorbeeld wordt de lijst in de array
items gedefinieerd
en wordt deze bij het maken van de DataProvider-instantie (
new DataProvider(items)
) opgegeven als de parameter en wordt hieraan de eigenschap
dataProvider
van de component List toegewezen.
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);
De array bestaat uit paren label- en waardevelden. De labelvelden zijn
label
en
data
, en in de waardevelden worden de namen en verjaardagen van de kinderen weergegeven. In het labelveld wordt aangegeven welke inhoud wordt weergegeven in de lijst, in dit geval de namen van de kinderen. De lijst ziet er zo uit:
Een lijst die is gevuld door een DataProvider
De waarde van het gegevensveld is beschikbaar wanneer de gebruiker een item in de lijst selecteert door erop te klikken en de gebeurtenis
change
veroorzaakt. In het volgende voorbeeld worden een tekstgebied (
aTa
) en een gebeurtenishandler (
changeHandler
) aan het voorgaande voorbeeld toegevoegd om de verjaardag van het kind weer te geven wanneer de gebruiker een naam selecteert in de lijst.
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;
};
Wanneer de gebruiker nu de naam van een kind in de lijst selecteert, wordt in het tekstgebied de verjaardag van het kind weergegeven, zoals wordt weergegeven in de volgende afbeelding. Dit wordt gedaan door de functie
changeHandler()
wanneer deze de eigenschap
text
van de TextArea-component (
aTa.text
) instelt op de waarde van het gegevensveld in het geselecteerde item (
event.target.selectedItem.data
). De eigenschap
event.target
is het object dat de gebeurtenis heeft geactiveerd, in dit geval de component List.
Het gegevensveld van de DataProvider van een component List weergeven
U kunt andere gegevens dan tekst opnemen in een DataProvider. In het volgende voorbeeld worden filmclips opgenomen in een DataProvider die gegevens aanbiedt aan een component TileList. De DataProvider wordt gemaakt door
addItem()
aan te roepen om elk item toe te voegen nadat de filmclip, een gekleurd vak, is gemaakt.
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();
U kunt in plaats van een array ook XML-gegevens gebruiken om een DataProvider-object te vullen. Met de volgende code worden gegevens in het XML-object
employeesXML
opgeslagen en vervolgens wordt dat object doorgegevens als de waardeparameter van de constructorfunctie
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;
U kunt gegevens als attributen van de XML-gegevens opgeven, zoals in de vorige code, of als eigenschappen van de XML-gegevens, zoals in de volgende code:
var employeesXML:XML =
<employees>
<employee>
<Name>Edna</Name>
<ID>22</ID>
</employee>
<employee>
<Name>Stu</Name>
<ID>23</ID>
</employee>
</employees>;
De DataProvider bevat tevens een set methoden en eigenschappen waarmee u deze kunt openen en bewerken. U kunt de API van de DataProvider gebruiken om items toe te voegen, te verwijderen, te vervangen, te sorteren en samen te voegen in een DataProvider.
Een DataProvider bewerken
U kunt items aan een DataProvider toevoegen met de methoden
addItem()
en
addItemAt()
. In het volgende voorbeeld worden items toegevoegd die de gebruiker invoert in het tekstveld van een bewerkbare ComboBox. Er is een ComboBox naar het werkgebied gesleept en hieraan is de naam
aCb
gegeven.
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);
}
Via de DataProvider kunt u tevens componentitems vervangen en verwijderen. In het volgende voorbeeld worden de twee afzonderlijke List-componenten
listA
en
listB
geïmplementeerd en wordt een knop met het label Sync weergegeven. Wanneer de gebruiker op de knop klikt, wordt de methode
replaceItemAt()
gebruikt om de items in
listB
te vervangen door de items in
listA
. Als
listA
langer is dan
listB
, wordt de methode
addItem()
aangeroepen om de extra items toe te voegen aan
listB
. Als
listB
langer is dan
listA
, wordt de methode
removeItemAt()
aangeroepen om de extra items te verwijderen uit
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++);
}
}
}
U kunt een DataProvider ook gebruiken voor samenvoegings- en sorteerbewerkingen met de methoden
merge()
,
sort()
en
sortOn()
. In het volgende voorbeeld worden twee DataGrid-instanties (
aDg
en
bDg
) gevuld met gedeeltelijke spelerslijsten van twee softbalteams. Er wordt een knop met het label Merge toegevoegd en wanneer de gebruiker hierop klikt, voegt de gebeurtenishandler (
mrgHandler
) de lijst voor
bDg
samen met de lijst voor
aDg
en wordt het resulterende DataGrid gesorteerd op de kolom Naam.
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");
}
Zie de klasse DataProvider in de
Naslaggids voor ActionScript 3.0
voor meer informatie.
|
|
|