DataProvider ile çalışma

DataProvider, ComboBox, DataGrid, List ve TileList bileşenlerine veri sağlamak için kullanabileceğini bir veri kaynağıdır. Bu bileşen sınıflarının her biri, bileşenin hücrelerini verilerle doldurmak için bir DataProvider nesnesi atayabileceğiniz dataProvider özelliğine sahiptir. Tipik olarak, veri sağlayıcı, Array veya XML nesnesi gibi bir veri koleksiyonudur.

DataProvider oluşturma

ComboBox, List ve TileList bileşenleri için, geliştirme ortamında dataProvider parametresini kullanarak bir DataProvider öğesi oluşturabilirsiniz. DataGrid bileşeninin birçok sütunu olabileceğinden ve dolayısıyla veri sağlayıcısı daha karmaşık olabileceğinden bu bileşenin Özellik denetçisinde bir dataProvider parametresi yoktur. DataGrid öğesinin yanı sıra bu bileşenler için de DataProvider oluşturmak üzere ActionScript kullanabilirsiniz.

dataProvider parametresini kullanma

Özellik denetçisinin veya Bileşen denetçisinin Parametreler sekmesinde dataProvider parametresini tıklatarak ComboBox, List ve TileList bileşenleri için basit bir veri sağlayıcı oluşturabilirsiniz.

Başlangıçta boş bir Array öğesi görüntüleyen değer hücresini çift tıklatırsanız, veri sağlayıcısı oluşturmak için birden çok etiket ve veri değeri girmenize olanak sağlayan Değerler iletişim kutusunu açarsınız.

dataProvider için Değerler iletişim kutusu

dataProvider bileşenine bir öğe eklemek için artı işaretini tıklatın. Bir öğeyi silmek için eksi işaretini tıklatın. Seçili öğeyi listede bir öğe yukarı taşımak için yukarı oku veya seçili öğeyi listede bir öğe aşağı taşımak için aşağı oku tıklatın. Aşağıdaki resimde, çocukların adlarının ve doğum tarihlerinin bir listesini oluşturan Değerler iletişim kutusu gösterilmektedir.

Verilerin yer aldığı Değerler iletişim kutusu

Oluşturduğunuz Array öğesi, etiket ve değer alanları çiftlerinden oluşur. Etiket alanları, label ve data iken, değer alanları da çocukların adları ve doğum tarihleridir. Etiket alanı, List öğesinde görüntülenen içeriği tanımlar, bu örnekte içerik çocukların adlarıdır. Sonuçta elde edilen ComboBox şöyle görünür:

DataProvider tarafından doldurulan ComboBox

Veri ekleme işlemini bitirdiğinizde, iletişim kutusunu kapatmak için Tamam'ı tıklatın. dataProvider parametresindeki Array öğesi şimdi oluşturduğunuz öğelerle doldurulur.

verilerin yer aldığı dataProvider parametresi

Bileşenin dataProvider özelliğine erişmek için ActionScript kullanarak oluşturduğunuz etiket ve veri değerlerine erişebilirsiniz.

ActionScript kullanarak DataProvider oluşturma

Bir Array veya XML nesnesinde veri oluşturup DataProvider yapıcısına value parametresi olarak nesneyi sağlayarak bir DataProvider oluşturabilirsiniz.

Not: ActionScript 3.0'da, özellik bir DataProvider nesnesi olarak tanımlandığından ve yalnızca DataProvider türünde bir nesne alabildiğinden, bir Array veya XML nesnesini doğrudan bir dataProvider özelliğine atayamazsınız.

Aşağıdaki örnek, tek bir satırlar sütunu olan List bileşenini birçok çocuk adı ve doğum tarihiyle doldurur. Bu örnek, items Array öğesinde listeyi tanımlar ve DataProvider örneğini ( yeni DataProvider(öğeler) ) oluşturduğunda bunu parametre olarak sunup List bileşeninin dataProvider özelliğine atar.

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

Array öğesi, etiket ve değer alanları çiftlerinden oluşur. Etiket alanları, label ve data iken, değer alanları da çocukların adları ve doğum tarihleridir. Etiket alanı, List öğesinde görüntülenen içeriği tanımlar, bu örnekte içerik çocukların adlarıdır. Sonuçta elde edilen List şöyle görünür:

DataProvider tarafından doldurulmuş bir List öğesi

Kullanıcı üzerini tıklatıp listedeki bir öğeyi seçtiğinde, veri alanının değeri kullanılabilir duruma geçer ve bir change olayı başlatılır. Aşağıdaki örnek, kullanıcı List öğesinde bir ad seçtiğinde çocuğun doğum gününü görüntülemek için önceki örneğe bir TextArea ( aTa ) ve bir olay işleyici ( changeHandler ) ekler.

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

Şimdi kullanıcı List öğesinde bir çocuğun adını seçtiğinde, aşağıdaki resimde gösterildiği gibi çocuğun doğum günü TextArea bileşeninde görüntülenir. Bu, changeHandler() işlevi tarafından TextArea ( aTa.text ) öğesinin text özelliğinin seçili öğedeki veri alanının değerine ( event.target.selectedItem.data ) ayarlanmasıyla gerçekleştirilir. event.target özelliği, olayı tetikleyen nesnedir (bu durumda List).

List bileşeninin DataProvider öğesinden veri alanını görüntüleme

DataProvider öğesine metin dışında da veriler dahil edebilirsiniz. Aşağıdaki örnek, TileList öğesine veri sağlayan DataProvider öğesine MovieClip öğelerini dahil eder. Bu, MovieClip (renkli kutu) oluşturduktan sonra her bir öğeyi eklemek için addItem() öğesini çağırarak DataProvider bileşenini oluşturur.

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

Bir DataProvider nesnesini doldurmak için de XML verilerini (dizi yerine) kullanabilirsiniz. Örneğin, şu kod, verileri employeesXML adındaki bir XML nesnesine saklar ve sonra DataProvider() yapıcısı işlevinin değer parametresi olarak bu nesneyi iletir:

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;

Verileri önceki kodda olduğu gibi XML verilerinin nitelikleri olarak veya aşağıdaki kodda olduğu gibi XML verilerinin özellikleri olarak sağlayabilirsiniz:

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

DataProvider öğesi ayrıca kendisine erişip bu öğeyi işlemenizi sağlayan yöntemler ve özellikler kümesine de sahiptir. DataProvider içinde öğeler eklemek, kaldırmak, değiştirmek, sıralamak ve birleştirmek için DataProvider API'sini kullanabilirsiniz.

DataProvider öğesini işleme

addItem() ve addItemAt() yöntemleriyle DataProvider bileşenine öğeler ekleyebilirsiniz. Aşağıdaki örnek, kullanıcının düzenlenebilir bir ComboBox bileşeninin metin alanına girdiği öğeleri ekler. Bu, ComboBox bileşeninin Sahne Alanı dışına sürüklendiğini ve bu bileşene aCb örnek adının verildiğini varsayar.

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

DataProvider yoluyla da bir bileşendeki öğeleri değiştirebilir ve kaldırabilirsiniz. Aşağıdaki örnek, iki ayrı List bileşenini ( listA ve listB ) uygular ve Sync etiketli bir Button öğesi sağlar. Kullanıcı Button öğesini tıklattığında, örnek listB içindeki öğeleri listA içindeki öğelerle değiştirmek için replaceItemAt() yöntemini kullanır. listA öğesi listB öğesinden daha uzun olursa, örnek, listB öğesine fazladan öğe eklemek için addItem() yöntemini çağırır. listB öğesi listA öğesinden daha uzun olursa, örnek, ListB öğesindeki fazladan öğeleri kaldırmak için removeItemAt() yöntemini çağırır.

// 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++); 
        } 
    } 
}

Ayrıca merge() , sort() ve sortOn() yöntemlerini kullanarak da DataProvider öğesini birleştirip sıralayabilirsiniz. Aşağıdaki örnek, iki DataGrid örneğini ( aDg ve bDg ) iki beysbol takımının kısmi görev listesiyle doldurur. Merge etiketine sahip bir Button öğesi ekler ve kullanıcı bunun üzerini tıklattığında, olay işleyici ( mrgHandler ) bDg görev listesini aDg görev listesiyle birleştirir ve sonuçta elde edilen DataGrid öğesini Ad sütununda sıralar.

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

Daha fazla bilgi için, Adobe® Flash® Professional CS5 için ActionScript® 3.0 Başvurusu bölümündeki DataProvider sınıfına bakın.