2009-02-07 60 views
4

我有了一個cloumn複選框項目渲染允許行選擇一個數據網格訪問的ItemRenderer的:在DataGrid

主要應用:

 

<mx:DataGrid id="dg"> 
    <mx:columns> 
     <mx:DataGridColumn id="ir" itemRenderer="renderers.RowCheckbox" /> 
     <mx:DataGridColumn dataField="Name" headerText="Name" /> 
    </mx:columns> 
</mx:DataGrid> 
 

的項目渲染:

 

<-- RowCheckbox --> 
<?xml version="1.0" encoding="utf-8"?> 
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center"> 
    <mx:CheckBox id="chk"/> 
</mx:HBox> 
 

如何獲取項目渲染器/複選框的句柄,以便我可以de termine哪些行被檢查?

回答

9

只是一個建議的話:我們在應用程序中遇到了類似的問題,我們通過向datagrid的數據提供者中的實體添加「selected」屬性來解決此問題。然後checkBox的選定屬性綁定到我們實體的選定屬性。要知道選擇了哪些,我們只是繞過數據提供者中的實體,而不是項目渲染器。經過很多不同的方法,這真的是最好的選擇。

如果我沒有記錯的話,問題在於itemrenderer不能正確記住所選狀態,並且在您上下滾動時數據網格完全混亂。滾動後選擇了錯誤的行。

另一種選擇是在項目渲染器中派發一個事件,該事件一直冒泡到控制數據網格的控件。然後,您可以聽取這些事件並更新您的模型以反映這些更改。

0

您可以使用由ListBase的所有子類公開的indexToItemRenderer()方法。

例如:

private function someFunction(index:int):void 
{ 
    var rowCheckbox:RowCheckbox = dg.indexToItemRenderer(index) as RowCheckbox; 
    trace(rowCheckbox.chk.selected.toString()); 
} 

...其中index代表DataGrid的項目你想測試他的 「CHK」 屬性的索引。

+0

我不認爲這將適用於不同列中的多個項目渲染器,例如我需要另一列中的渲染器,我該怎麼做? – mmattax 2009-02-08 01:01:49

+0

好點,是的。 Christophe的答案實際上更好;我在單列非滾動列表上使用了上述方法,並且獲得了很好的結果,但是您真正需要的不是底層數據的屬性,也不是可見的顯示對象的屬性,而是中間的東西。 – 2009-02-09 00:02:30

+0

您可以修改上面的函數來檢查自定義渲染器的行和列... someFunction(row:int,cell:int):void – AndrewB 2009-06-08 02:59:53

2

我遇到了類似的問題與數據網格和多個項目渲染器和滾動時項目渲染器的重用。爲了訪問DataGrid項目渲染器,我擴展了DataGrid。我的第一個想法是使用indicesToIndex()後跟indexToItemRenderer()。不幸的是,這些方法並沒有做什麼,我希望,所以我說的indicesToItemRenderer()方法:

包com.whatever.controls {

import mx.controls.DataGrid; 
import mx.controls.listClasses.IListItemRenderer; 

public class CustomDataGrid extends DataGrid 
{ 

    public function CustomDataGrid() 
    { 
     super(); 
    } 

    public function indicesToItemRenderer(rowIndex:int, colIndex:int):IListItemRenderer 
    { 
     var firstItemIndex:int = verticalScrollPosition - offscreenExtraRowsTop; 
     if (rowIndex < firstItemIndex || 
      rowIndex >= firstItemIndex + listItems.length 
      ) 
     { 
      return null; 
     } 

     return listItems[rowIndex - firstItemIndex][colIndex]; 
    } 

} 

要滾動問題時,解決重複使用項目渲染器,請參閱這篇文章:

http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html

它歸結爲覆蓋數據setter和數據存儲性能。例如,我有一列使用CheckBox itemRenderer,另一列使用ComboBox。對於這兩個我聽change事件和存儲選擇的selectedIndex等數據時性能改變和覆蓋數據setter方法來設置這些屬性:

 override public function set data(value:Object):void 
     { 
      if (value != null) 
      { 
       super.data = value; 

       if (data.hasOwnProperty('selected') && data.selected) 
       { 
        selected = data.selected; 
       } 
       else 
       { 
        selected = false; 
       } 
      } 
     } 
-1

在ItemRenderer的,嘗試將複選框組件在VBox中..解決滾動問題。