DataGridのItemRendererにButtonを設置したところ、VBox上に配置した場合と、
直接配置した場合のclickイベントのtarget、及びCurrentTargetが異なる結果となっています。
VBox上に配置した場合は、自分自身の「Button」がtargetとなるのですが、
直接配置した場合は、「・・・_inlineComponent2」がtargetになってしまいます。
詳細は、下記のサンプルをご参照ください。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private var tmpArr:Array = [{col1:"", col2:"", col3:"aaa"}, {col1:"", col2:"", col3:"bbb"}];
private function onCreationComplete():void{
dg.dataProvider = tmpArr;
}
public function btnOnClickHandler(event:MouseEvent):void{
Alert.show("Target:" + event.target.className.toString() + "\nCurrentTarget:" + event.currentTarget.className.toString());
}
]]>
</mx:Script>
<mx:DataGrid x="32" y="23" id="dg" width="568">
<mx:columns>
<mx:DataGridColumn width="100" headerText="VBox有" dataField="col1" sortable="false" >
<mx:itemRenderer>
<mx:Component>
<mx:VBox horizontalAlign="center">
<mx:Button label="VBox有" click="outerDocument.btnOnClickHandler(event)" height="20">
</mx:Button>
</mx:VBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
<mx:DataGridColumn width="100" headerText="VBox無" dataField="col2" sortable="false" >
<mx:itemRenderer>
<mx:Component>
<mx:Button label="VBox無" click="outerDocument.btnOnClickHandler(event)" height="20">
</mx:Button>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
<mx:DataGridColumn headerText="項目名" dataField="col3" />
</mx:columns>
</mx:DataGrid>
</mx:Application>
この件について、Adobeに問い合わせたところ、下記の回答が返ってきました。
【Adobeの回答】
ItemRendererにおけるTarget、及びCurrentTargetの決定方法は、
コンポーネントのルートタグであるかどうかによって決定いたします。
コンポーネントのルートタグである場合は、今回のサンプルで確認されましたように
"_inlineComponent2"のように表示されます。
コンポーネントにid="xxx"プロパティを追加して、
「コンポーネントのルートタグで id 属性を指定することはできません。」
のコンパイルエラーが出るかでないかで確認することができます。
このような場合に、どのオブジェクトがイベントを発生させたかを確認する方法
といたしましては(統一させる方法)、
VBoxで統一する、もしくは例えばautomationName等のプロパティを使うなどがご
ざいます。
//参考例ここから
<mx:Button label="VBox無" height="20" automationName="Button"
click="outerDocument.btnOnClickHandler(event)">
Alert.show("Target:" + event.target.automationName +
"\nCurrentTarget:" + event.currentTarget.automationName);
//ここまで
Target、及びCurrentTargetを扱う際のご参考に!!