2009-07-08 9 views
4

私は、いくつかのデータ列を表示するDataGridコンポーネントを持っています。このボタンには、ユーザーがレコードに対してアクションを実行できるようにするボタンが表示されます。Flex DataGrid itemRendererのボタンがクリックされたときを知る方法はありますか?

<mx:DataGrid dataProvider="{myData}"> 
    <mx:columns> 
     <mx:DataGridColumn dataField="firstName" headerText="First Name" 
      width="75" /> 

     <mx:DataGridColumn dataField="LastName" headerText=" Last Name" 
      width="150" /> 

     <mx:DataGridColumn dataField="phone" headerText="Phone" 
      width="120" /> 

     <mx:DataGridColumn headerText="" width="110"> 
      <mx:itemRenderer> 
       <mx:Component> 
        <mx:Box horizontalAlign="center" width="100%"> 
         <mx:Button label="Take Action" /> 
        </mx:Box> 
       </mx:Component> 
      </mx:itemRenderer> 
     </mx:DataGridColumn> 
    </mx:columns> 
</mx:DataGrid> 

は、私はそこに利用できる他のデータを使用して、親コンポーネントでアクションを実行する必要がありますが、DataGrid内のデータには無関係。

親コンポーネント内のボタンクリックをキャッチし、それに対応するレコードを知る最も良い方法は何ですか?

カスタムイベント、アイテムエディタなどを完全に使用する必要がありますか?

答えて

1

ありがとうございました。ここでは、私が前に読んだ記事を読んだ後に思いついた最終的な解決策があります。ボタンをクリックしたアイテムを別のアイテムのプロパティである配列に追加したいので、 "他のアイテム"をプロパティとしてDataGridコンポーネントに渡し、itemRendererの関数呼び出しでアクションを実行します。

/* CustomDataGrid.mxml */ 
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 
      public var otherData:Object; 

      public function takeAction(item:Object):void 
      { 
       otherData["children"][0] = item; 
      } 
     ]]> 
    </mx:Script> 

    <mx:columns> 
     <mx:DataGridColumn dataField="firstName" headerText="First Name" 
      width="75" /> 

     <mx:DataGridColumn dataField="LastName" headerText=" Last Name" 
      width="150" /> 

     <mx:DataGridColumn dataField="phone" headerText="Phone" 
      width="120" /> 

     <mx:DataGridColumn headerText="" width="110" 
      itemRender="ActionButtonItemRenderer" /> 
    </mx:columns> 
</mx:DataGrid> 

/* ActionButtonItemRenderer.as */ 
package 
{ 
    import flash.events.MouseEvent; 

    import mx.controls.Button; 

    public class ActionButtonItemRenderer extends Button 
    { 
     public function ActionButtonItemRenderer() 
     { 
      super(); 

      label = "Take Action"; 
     } 

     override protected function clickHandler(event:MouseEvent):void 
     { 
      super.clickHandler(event); 

      var owner:CustomDataGrid = listData.owner as CustomDataGrid; 

      owner.takeAction(data); 
     } 
    } 
} 
2

itemRendererをクラスにしてから、そのクラス内のDataGridをthe methods described hereで参照する必要があります。その後、保持しているコンテナで簡単に聴取できるDataGridからイベントを送出できます。あなたがしたくないことは、バブリングに頼るかitemRendererを直接聞くことです。おそらく、イベントリスナーがこの情報にすばやくアクセスできるように、DataGrid行のdataプロパティを持つカスタムイベントを作成する必要があります。

関連する問題