2009-07-08 143 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中的數據無關。

什麼是捕獲父組件中的按鈕點擊的最佳方式,並知道它對應的記錄是什麼?

我應該使用自定義事件,還是itemEditor或其他東西?

回答

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成爲一個類,然後使用the methods described here從該類內引用您的DataGrid。然後,您可以從DataGrid派發事件,這些事件很容易在容納它的容器中偵聽。你不想做的就是依靠冒泡或試圖直接收聽itemRenderer。您可能需要創建一個自定義事件,該事件包含DataGrid行的data屬性,以便您的事件偵聽器可以快速訪問此信息。

相關問題