DataProvider를 사용한 작업

DataProvider는 ComboBox, DataGrid, List 및 TileList 구성 요소에 데이터를 제공하는 데 사용할 수 있는 데이터 소스입니다. 이들 구성 요소 클래스에는 dataProvider 속성이 하나씩 있으며, 이 속성에는 해당 구성 요소의 셀을 데이터로 채우는 데 사용할 수 있는 DataProvider 객체를 할당할 수 있습니다. 일반적으로 데이터 공급자는 Array 객체나 XML 객체와 같은 데이터 컬렉션입니다.

DataProvider 만들기

ComboBox, List 및 TileList 구성 요소의 경우에는 제작 환경에서 dataProvider 매개 변수를 사용하여 DataProvider를 만들 수 있습니다. 여러 열을 포함할 수 있는 DataGrid 구성 요소의 경우에는 데이터 공급자가 더 복잡하기 때문에 속성 관리자에 dataProvider 매개 변수가 없습니다. ActionScript를 사용하여 DataGrid를 비롯한 이들 구성 요소의 DataProvider를 만들 수도 있습니다.

dataProvider 매개 변수 사용

속성 관리자나 [구성 요소 관리자]의 [매개 변수] 탭에서 dataProvider 매개 변수를 클릭하여 ComboBox, List 및 TileList 구성 요소의 데이터 공급자를 간단히 만들 수 있습니다.

기본적으로 빈 Array가 표시되어 있는 값 셀을 두 번 클릭하면 [값] 대화 상자가 열립니다. 이 대화 상자에서 여러 레이블과 데이터 값을 입력하여 데이터 공급자를 만들 수 있습니다.

dataProvider의 값 대화 상자

dataProvider에 항목을 추가하려면 더하기 기호를 클릭하고 항목을 삭제하려면 빼기 기호를 클릭합니다. 위쪽 화살표나 아래쪽 화살표를 클릭하면 선택한 항목을 목록에서 위로 또는 아래로 이동할 수 있습니다. 다음 그림에서는 자녀의 이름과 생일 목록을 만드는 [값] 대화 상자를 보여 줍니다.

데이터가 입력된 값 대화 상자

여기서 만든 Array는 레이블과 값 필드 쌍으로 구성됩니다. 레이블 필드는 label data 이며 값 필드는 각 자녀의 이름과 생일입니다. 레이블 필드는 List에 표시되는 내용, 즉 이 경우에는 자녀의 이름을 나타냅니다. 이렇게 만든 ComboBox의 모양은 다음과 같습니다.

DataProvider로 채워진 ComboBox

데이터를 모두 추가한 후에는 [확인]을 클릭하여 대화 상자를 닫습니다. 이제 dataProvider 매개 변수의 Array가 방금 만든 항목으로 채워집니다.

데이터가 있는 dataProvider 매개 변수

ActionScript를 통해 구성 요소의 dataProvider 속성에 액세스하여 레이블 및 데이터 값에 액세스할 수도 있습니다.

ActionScript를 사용하여 DataProvider 만들기

Array 또는 XML 객체에 데이터를 만든 다음 이 객체를 DataProvider 생성자에 value 매개 변수로 제공하여 DataProvider를 만들 수 있습니다.

참고: ActionScript 3.0에서는 dataProvider 속성이 DataProvider 객체로 정의되어 있기 때문에 이 속성에는 DataProvider 형식의 객체만 할당할 수 있고 Array 또는 XML 객체는 직접 할당할 수 없습니다.

다음 예제에서는 행이 여러 개이고 열이 하나인 List 구성 요소를 여러 명의 자녀 이름과 생일로 채웁니다. 이 예제에서는 items Array에 목록을 정의한 다음, DataProvider 인스턴스( new DataProvider(items)) 를 만들고 List 구성 요소의 dataProvider 속성에 이 인스턴스를 할당할 때 이 목록을 매개 변수로 제공합니다.

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는 레이블과 값 필드 쌍으로 구성됩니다. 레이블 필드는 label data 이며 값 필드는 각 자녀의 이름과 생일입니다. 레이블 필드는 List에 표시되는 내용, 즉 이 경우에는 자녀의 이름을 나타냅니다. 이렇게 만든 List의 모양은 다음과 같습니다.

DataProvider로 채워진 List

사용자가 목록에서 항목을 클릭하여 선택하면 change 이벤트가 발생하고, 그 결과로 데이터 필드의 값을 사용할 수 있습니다. 다음 예제에서는 사용자가 목록에서 이름을 선택할 때 자녀의 생일이 표시되도록 이전 예제에 TextArea( aTa )와 이벤트 핸들러( changeHandler )를 추가합니다.

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

이제 사용자가 List에서 자녀의 이름을 선택하면 다음 그림과 같이 해당 자녀의 생일이 TextArea에 표시됩니다. 이를 위해 changeHandler() 함수는 TextArea( aTa.text )의 text 속성을 선택된 항목( event.target.selectedItem.data )의 데이터 필드 값으로 설정합니다. event.target 속성은 이벤트를 트리거한 객체, 즉 List입니다.

List에 대한 DataProvider의 데이터 필드 표시

DataProvider에는 텍스트 이외의 데이터를 포함할 수 있습니다. 다음 예제에서는 TileList에 데이터를 제공하는 DataProvider에 무비 클립을 포함합니다. 이 예제에서는 색상이 설정된 무비 클립을 만든 다음 addItem() 호출을 통해 각 항목을 추가하여 DataProvider를 만듭니다.

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

배열 대신 XML 데이터를 사용하여 DataProvider 객체를 채울 수도 있습니다. 예를 들어, 다음 코드는 employeesXML 이라는 XML 객체에 데이터를 저장한 후 이 객체를 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;

데이터를 앞의 코드와 같이 XML 데이터의 특성으로 제공하거나 다음 코드와 같이 XML 데이터의 속성으로 제공할 수 있습니다.

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

DataProvider에는 DataProvider를 액세스하고 조작하는 데 사용할 수 있는 여러 가지 메서드와 속성이 있습니다. DataProvider API를 사용하여 DataProvider에서 항목을 추가, 제거, 바꾸기, 정렬 및 병합할 수 있습니다.

DataProvider 조작

addItem() addItemAt() 메서드는 DataProvider에 항목을 추가하는 데 사용됩니다. 다음 예제에서는 사용자가 편집 가능한 ComboBox의 텍스트 필드에 입력하는 항목을 추가합니다. 이 예제에서는 ComboBox를 스테이지에 드래그하고 인스턴스 이름을 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); 
}

DataProvider를 통해 구성 요소의 항목을 바꾸거나 제거할 수도 있습니다. 다음 예제에서는 listA listB 라는 두 개의 List 구성 요소를 구현하고 Sync라는 레이블이 지정된 Button을 제공합니다. 사용자가 Button을 클릭하면 replaceItemAt() 메서드를 통해 listB 의 항목이 listA 의 항목으로 바뀝니다. listA listB 보다 긴 경우에는 addItem() 메서드를 호출하여 listB 에 항목을 더 추가합니다. 또한 listB listA 보다 긴 경우에는 removeItemAt() 메서드를 호출하여 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++); 
        } 
    } 
}

merge() , sort() sortOn() 메서드를 사용하여 DataProvider를 병합하거나 정렬할 수도 있습니다. 다음은 aDg bDg 라는 두 개의 DataGrid 인스턴스를 소프트볼 팀 명단으로 채웁니다. 그런 다음 레이블이 Merge인 Button을 추가합니다. 사용자가 이 Button을 클릭하면 이벤트 핸들러( mrgHandler )가 bDg 의 명단과 aDg 의 명단을 병합하고 Name 열에서 결과 DataGrid를 정렬합니다.

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

자세한 내용은 ActionScript 3.0 참조 설명서 를 참조하십시오.