データグリッドなどのリストコントロールで、アイテムレンダラーに編集可能なコンポーネントを使用して
変更したデータ内容をデータプロバイダに戻す方法をご紹介します。
早速、検証用アプリで動作確認を行っていきましょう。
サンプルソースは以下の通りです。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.collections.ArrayCollection;
[Bindable]
private var initDG:ArrayCollection = new ArrayCollection([
{Album:'Slanted and Enchanted'},
{Album:'Brighten the Corners'}
]);
//inidDGの内容を表示します
private function checkBtnHandler():void {
Alert.show(
"initDGの内容確認" + "\n\n" +
"(0)=" + Object(initDG.getItemAt(0))["Album"].toString() + "\n" +
"(1)=" + Object(initDG.getItemAt(1))["Album"].toString()
);
}
]]>
</mx:Script>
<mx:VBox>
<mx:DataGrid id="dg1" dataProvider="{initDG}" width="300">
<mx:columns>
<mx:DataGridColumn headerText="Album" dataField="Album">
<mx:itemRenderer>
<mx:Component>
<mx:TextInput/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<mx:Button label="check!!" id="checkBtn" click="checkBtnHandler()"/>
</mx:VBox>
</mx:Application>
起動直後の画面です。

「check!!」ボタンを押下し、データプロバイダにバインディングしている変数(initDG)の内容を確認しておきます。

次に1行目のデータを変更します。

再度「check!!」ボタンで変数(initDG)の内容を確認してみます。

結果は、先程と変わっていません。
つまり、データプロバイダに反映されていないことになります。
では、サンプルコードを修正してみましょう。
データグリッドのeditableプロパティに「true」を設定してみます。
<mx:DataGrid id="dg1" dataProvider="{initDG}" width="300" editable="true">
<mx:columns>
<mx:DataGridColumn headerText="Album" dataField="Album">
<mx:itemRenderer>
<mx:Component>
<mx:TextInput/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
起動後、先程と同様に1行目のデータを変更して「check!!」ボタンを押下します。

データプロバイダに反映されていることが確認できました。
editableを「true」にすることで、データプロバイダ内のアイテムを編集することが可能となります。
これを拡張して、2つのデータグリッド間でデータの同期を取るように作り変えてみましょう。
サンプルソースは以下になります。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.collections.ArrayCollection;
[Bindable]
private var initDG:ArrayCollection = new ArrayCollection([
{Album:'Slanted and Enchanted'},
{Album:'Brighten the Corners'}
]);
//inidDGの内容を表示します
private function checkBtnHandler():void {
Alert.show(
"initDGの内容確認" + "\n\n" +
"(0)=" + Object(initDG.getItemAt(0))["Album"].toString() + "\n" +
"(1)=" + Object(initDG.getItemAt(1))["Album"].toString()
);
}
]]>
</mx:Script>
<mx:VBox>
<mx:DataGrid id="dg1" dataProvider="{initDG}" width="300" editable="true">
<mx:columns>
<mx:DataGridColumn headerText="Album" dataField="Album">
<mx:itemRenderer>
<mx:Component>
<mx:TextInput/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<mx:DataGrid id="dg2" dataProvider="{initDG}" width="300" editable="true">
<mx:columns>
<mx:DataGridColumn headerText="Album" dataField="Album">
<mx:itemRenderer>
<mx:Component>
<mx:TextInput/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<mx:Button label="check!!" id="checkBtn" click="checkBtnHandler()"/>
</mx:VBox>
</mx:Application>
起動直後の画面です。

1つ目のデータグリッドの1行目を変更します。

2つ目のデータグリッドも変更されました。
データプロバイダの参照先を同じ変数(initDG)にしているため、このようなことが可能となります。
応用次第では、何か面白いことが出来そうです。
次回はアイテムレンダラーにチェックボックスを使ってみます。