|
Um DataProvider é uma origem de dados que você pode usar para fornecer dados aos componentes ComboBox, DataGrid, List e TileList. Cada uma dessas classes de componente tem uma propriedade
dataProvider
à qual você pode atribuir um objeto DataProvider para preencher as células do componente com dados. Geralmente, um provedor de dados é uma coleção de dados, como um objeto Array ou XML.
Criar um DataProvider
Para os componentes ComboBox, List e TileList, você pode criar um DataProvider usando o parâmetro
dataProvider
no ambiente de criação. O componente DataGrid não tem um parâmetro dataProvider no Inspetor de propriedades porque ele tem várias colunas e, conseqüentemente, seu provedor de dados é mais complexo. Você também pode usar o ActionScript para criar um DataProvider para esses componentes, bem como para a DataGrid.
Uso do parâmetro dataProvider
Você pode criar um provedor de dados simples para os componentes ComboBox, List e TileList clicando no parâmetro dataProvider na aba Parâmetros do Inspetor de propriedades ou do Inspetor de componentes.
Se você clicar duas vezes na célula de valor, que inicialmente mostra uma matriz vazia, a caixa de diálogo Valores será aberta e você poderá inserir diversos valores de rótulo e dados para criar o provedor de dados.
Caixa de diálogo Valores de dataProvider
Clique no sinal de adição para adicionar um item ao parâmetro dataProvider. Clique no sinal de subtração para excluir um item. Clique na seta para cima a fim de mover um item selecionado para cima na lista ou clique na seta para baixo a fim de mover um item selecionado para baixo na lista. A ilustração a seguir mostra a caixa de diálogo Valores que cria uma lista de nomes de crianças e suas datas de aniversário.
Caixa de diálogo Valores com dados
A matriz criada consiste em pares de campos de rótulo e valor. Os campos de rótulo são
label
e
data
, e os campos de valor são os nomes das crianças e suas datas de aniversário. O campo de rótulo identifica o conteúdo que aparece na lista, que, neste caso, é representado pelos nomes das crianças. A ComboBox resultante terá esta aparência:
A ComboBox preenchida pelo DataProvider
Quando você terminar de adicionar os dados, clique em OK para fechar a caixa de diálogo. Agora, a matriz no parâmetro dataProvider é preenchida com os itens criados.
parâmetro dataProvider com dados
Você pode acessar os valores de rótulo e dados criados usando o ActionScript para acessar a propriedade
dataProvider
do componente.
Criar um DataProvider por meio do ActionScript
Você pode criar um DataProvider criando os dados em um objeto Array ou XML e fornecendo o objeto como parâmetro
value
para o construtor DataProvider.
Nota:
No ActionScript 3.0, você não pode atribuir um objeto Array ou XML diretamente a uma propriedade dataProvider porque a propriedade é definida como um objeto DataProvider e só pode receber um objeto do tipo DataProvider.
O exemplo a seguir preenche um componente List, que é uma coluna de linhas com os nomes de várias crianças e suas respectivas datas de aniversário. O exemplo define a lista na matriz
items
e a define como parâmetro quando cria a ocorrência de DataProvider (
new DataProvider(items)
) e a atribui à propriedade
dataProvider
do 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);
A matriz consiste em pares de campos de rótulo e valor. Os campos de rótulo são
label
e
data
, e os campos de valor são os nomes das crianças e suas datas de aniversário. O campo de rótulo identifica o conteúdo que aparece na lista, que, neste caso, é representado pelos nomes das crianças. A lista resultante terá esta aparência:
Uma lista preenchida por um DataProvider
O valor do campo de dados estará disponível quando o usuário selecionar um item na lista clicando nele e provocando um evento
change
. O exemplo a seguir adiciona uma TextArea (
aTa
) e um manipulador de eventos (
changeHandler
) ao exemplo anterior para exibir a data de aniversário da criança quando um usuário selecionar um nome na lista.
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;
};
Agora, quando um usuário selecionar o nome de uma criança na lista, a data de aniversário da criança será exibida na TextArea, conforme mostra a ilustração a seguir. Isso é feito pela função
changeHandler()
quando ela define a propriedade
text
da TextArea (
aTa.text
) para o valor do campo de dados no item selecionado (
event.target.selectedItem.data
). A propriedade
event.target
é o objeto que acionou o evento, que, neste caso, é a lista.
Exibição do campo de dados no DataProvider de uma lista
Você pode incluir dados que não sejam texto em um DataProvider. O exemplo a seguir inclui MovieClips em um DataProvider que fornece dados para uma TileList. Ele cria o DataProvider chamando o método
addItem()
para adicionar cada item depois que ele cria o MovieClip, uma caixa colorida.
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();
Você também pode usar os dados XML (em vez de uma matriz) para preencher um objeto DataProvider. Por exemplo, o código a seguir armazena dados em um objeto XML chamado
employeesXML
e passa esse objeto como parâmetro de valor da função do construtor
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;
Você pode fornecer dados como atributos dos dados XML, como no código anterior, ou como propriedades dos dados XML, como no código a seguir:
var employeesXML:XML =
<employees>
<employee>
<Name>Edna</Name>
<ID>22</ID>
</employee>
<employee>
<Name>Stu</Name>
<ID>23</ID>
</employee>
</employees>;
O DataProvider também tem um conjunto de métodos e propriedades que permitem a você acessá-los e manipulá-los. Você pode usar a API do DataProvider para adicionar, remover, substituir, classificar e mesclar itens em um DataProvider.
Manipular um DataProvider
Você pode adicionar itens a um DataProvider com os métodos
addItem()
e
addItemAt()
. O exemplo a seguir adiciona itens que um usuário digita no campo de texto de uma ComboBox editável. Ele assume que uma ComboBox foi arrastada para o Palco e recebeu o nome de ocorrência
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);
}
Você também pode substituir e remover itens em um componente por meio de seu DataProvider. O exemplo a seguir implementa dois componentes List separados,
listA
e
listB
, e fornece um Button com o rótulo Sincronizar. Quando um usuário clica em Button, o exemplo usa o método
replaceItemAt()
para substituir os itens de
listB
pelos itens de
listA
. Se
listA
for maior que
listB
, o exemplo chamará o método
addItem()
para adicionar os itens extras a
listB
. Se
listB
for maior que
listA
, o exemplo chamará o método
removeItemAt()
para remover os itens extras de
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++);
}
}
}
Você também pode mesclar e classificar um DataProvider usando os métodos
merge()
,
sort()
e
sortOn()
. O exemplo a seguir preenche duas ocorrências de DataGrid (
aDg
e
bDg
) com listagens parciais de dois times de beisebol. Ele adiciona um Button com o rótulo Mesclar e, quando o usuário clica nele, o manipulador de eventos (
mrgHandler
) mescla a lista de
bDg
com a lista de
aDg
e classifica a DataGrid resultante na coluna Nome.
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");
}
Para obter mais informações, consulte a classe DataProvider na
Referência do ActionScript 3.0
.
|
|
|