Un componente DataProvider è un'origine dati che può essere utilizzata per fornire dati ai componenti ComboBox, DataGrid, List e TileList. A ognuna di queste classi di componenti è associata una proprietà
dataProvider
a cui potete assegnare un oggetto DataProvider per inserire dati nelle celle del componente. Un fornitore di dati è solitamente una raccolta di dati, come un oggetto Array o XML.
Creare un componente DataProvider
Per i componenti ComboBox, List e TileList potete creare un DataProvider usando il parametro
dataProvider
nell'ambiente di creazione. Per il componente DataGrid non è disponibile un parametro dataProvider nella finestra di ispezione Proprietà, poiché può avere più colonne e il relativo fornitore di dati è quindi più complesso. Potete usare ActionScript per creare un DataProvider per questi componenti, oltre che per DataGrid.
Usare il parametro dataProvider
Per creare un fornitore di dati semplice per i componenti ComboBox, List e TileList, fate clic sul parametro dataProvider nella scheda Parametri della finestra di ispezione Proprietà o nella finestra di ispezione dei componenti.
Se fate doppio clic sulla cella valore, nella quale inizialmente è contenuto un oggetto Array vuoto, viene aperta la finestra di dialogo Valori, che consente di immettere più valori dei dati e delle etichette per creare il fornitore di dati.
Finestra di dialogo Valori per dataProvider
Fate clic sul segno più per aggiungere una voce a dataProvider. Fate clic sul segno meno per eliminare una voce. Fate clic sulla freccia su per spostare una voce selezionata verso l'alto nell'elenco o fate clic sulla freccia giù per spostare la voce verso il basso nell'elenco. Nella figura seguente è illustrata la finestra di dialogo Valori con un elenco di nomi di bambini e i relativi compleanni.
Finestra di dialogo Valori con dati
L'oggetto Array creato è costituito da coppie di campi di etichette e di valori. I campi delle etichette sono
label
e
data
ei campi dei valori sono i nomi dei bambini e i relativi compleanni. Il campo dell'etichetta identifica il contenuto visualizzato nel componente List, in questo caso i nomi dei bambini. Il componente ComboBox risultante sarà simile al seguente:
Il componente ComboBox compilato da DataProvider
Una volta completata l'aggiunta dei dati, fate clic su OK per chiudere la finestra di dialogo. Nell'oggetto Array nel parametro dataProvider sono ora inserite le voci create.
Potete accedere ai dati delle etichette e dei valori creati usando ActionScript per accedere alla proprietà
dataProvider
del componente.
Creare un componente DataProvider mediante ActionScript
Potete creare un DataProvider creando un oggetto Array o XML e specificando l'oggetto come parametro
value
per la funzione di costruzione DataProvider.
Nota:
in ActionScript 3.0 non potete assegnare un oggetto Array o XML direttamente a una proprietà dataProvider, in quanto la proprietà è definita come un oggetto DataProvider e può ricevere solo un oggetto del tipo DataProvider.
Nell'esempio seguente, un componente List, che è costituito da un'unica colonna di righe, viene compilato con i nomi di alcuni bambini e i relativi compleanni. Nell'esempio, l'elenco viene definito nell'Array
items
e viene specificato come parametro quando l'istanza DataProvider (
new DataProvider(items)
) viene creata e assegnata alla proprietà
dataProvider
del componente List.
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);
L'oggetto Array è costituito da coppie di campi di etichette e di valori. I campi delle etichette sono
label
e
data
ei campi dei valori sono i nomi dei bambini e i relativi compleanni. Il campo dell'etichetta identifica il contenuto visualizzato nel componente List, in questo caso i nomi dei bambini. Il componente List risultante sarà simile al seguente:
Il componente List compilato da DataProvider
Il valore del campo di dati è disponibile quando l'utente seleziona una voce nell'elenco facendo clic su di essa e causando la generazione di un evento
change
. Nell'esempio seguente viene aggiunto un componente TextArea (
aTa
) e un gestore di eventi (
changeHandler
) all'esempio precedente per visualizzare il compleanno del bambino quando l'utente seleziona un nome nel componente 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;
};
A questo punto, quando un utente seleziona il nome di un bambino nel componente List, nel componente TextArea viene visualizzato il relativo compleanno, come illustrato nella figura seguente. Questa operazione viene eseguita dalla funzione
changeHandler()
quando imposta la proprietà
text
del componente TextArea (
aTa.text
) sul valore del campo di dati nella voce selezionata (
event.target.selectedItem.data
). La proprietà
event.target
è l'oggetto che ha attivato l'evento, in questo caso List.
Visualizzazione del campo dei dati dall'oggetto DataProvider di un componente List
In un oggetto DataProvider potete includere dati diversi dal testo. Nell'esempio seguente vengono inclusi clip filmato in un DataProvider che fornisce i dati a TileList. Per creare l'oggetto DataProvider viene chiamato il metodo
addItem()
che aggiunge ogni voce dopo la creazione del clip filmato, una casella colorata.
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();
Per compilare un oggetto DataProvider, potete inoltre utilizzare dati XML, anziché un array. Ad esempio, il codice seguente memorizza i dati in un oggetto XML di nome
employeesXML
, quindi passa l'oggetto come parametro value della funzione di costruzione di
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;
Potete fornire dati come attributi dei dati XML, come nel codice precedente, o come proprietà dei dati XML, come nel codice riportato di seguito:
var employeesXML:XML =
<employees>
<employee>
<Name>Edna</Name>
<ID>22</ID>
</employee>
<employee>
<Name>Stu</Name>
<ID>23</ID>
</employee>
</employees>;
L'oggetto DataProvider ha inoltre un set di metodi e proprietà che ne consentono l'accesso e la gestione. Potete utilizzare l'API DataProvider per aggiungere, rimuovere, sostituire, ordinare e unire voci in un oggetto DataProvider.
Gestione di un componente Dataprovider
Potete aggiungere voci a un oggetto DataProvider con i metodi
addItem()
e
addItemAt()
. Nell'esempio riportato di seguito vengono aggiunte voci inserite dall'utente in un campo di testo di un componente ComboBox modificabile. Si presuppone che un componente ComboBox sia stato trascinato nello stage e che sia stato assegnato il nome di istanza
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);
}
Potete inoltre sostituire e rimuovere voci in un componente tramite il relativo DataProvider. Nell'esempio seguente vengono implementati due componenti List distinti,
listA
e
listB
e viene fornito un componente Button con l'etichetta Sync. Quando l'utente fa clic sul componente Button, nell'esempio viene utilizzato il metodo
replaceItemAt()
per sostituire le voci in
listB
con le voci in
listA
. Se la lunghezza di
listA
è maggiore di
listB
, nell'esempio viene chiamato il metodo
addItem()
per aggiungere voci supplementari a
listB
. Se la lunghezza di
listB
è maggiore di
listA
, nell'esempio viene chiamato il metodo
removeItemAt()
per rimuovere le voci supplementari da
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++);
}
}
}
Potete inoltre unire e ordinare un oggetto DataProvider utilizzando i metodi
merge()
,
sort()
e
sortOn()
. Nell'esempio seguente vengono compilate due istanze di DataGrid (
aDg
e
bDg
) con liste parziali per due squadre di softball. Viene aggiunto un componente Button con l'etichetta Merge e, quando l'utente fa clic su di esso, il gestore di eventi (
mrgHandler
) unisce la lista per
bDg
con la lista per
aDg
, quindi ordina l'oggetto DataGrid risultante nella colonna Name.
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");
}
Per ulteriori informazioni, vedete la classe DataProvider nella
Guida di riferimento di ActionScript 3.0
.
|
|
|