2011-01-07 62 views
1

我已经获得了复选框标题渲染器,可以很好地处理平面DP,但 分层集合视图是另一回事。点击后,我希望它选中给定列中的所有 复选框。这里是我的代码:带有HierarchicalCollectionView的CheckBox标题渲染器

var dp:HierarchicalCollectionView = _dataGrid.dataProvider as HierarchicalCollectionView; var testDp:GroupingCollection = dp.source as GroupingCollection; var rawDp:ArrayCollection = testDp.source as ArrayCollection;

for(var i:int = 0; i < rawDp.length; i ++){ rawDp [i] [_ dataField] = cb.selected; }

它选择第二级数据上的所有复选框,但不选择顶级的 级别的数据。我在这里错过了什么?我似乎无法找到它。

任何提示,非常感谢。谢谢。

回答

1

对于分层数据,您必须使用遍历分层数据的所有级别的光标。

var dp:IHierarchicalCollectionView = _dataGrid.hierarchicalCollectionView; 
var cursor:IViewCursor= dp.createCursor(); 

while (!cursor.afterLast) 
{ 
    cursor.current[_dataField] = cb.selected; 
    cursor.moveNext(); 
} 

Howerver,这只适用于先前已打开的节点。因此,要么展开所有节点与_dataGrid.expandAll()(你可以事后崩溃,因为他们的节点只需要打开一次)或手动循环您的分层数据:

function setCheckBoxValue(children:ArrayCollection, value:Boolean):void 
{ 
    for each (var child:Object in children) 
    { 
     if (child.hasOwnProperty("children") && child["children"]) 
      setCheckBoxValue(child["children"], value); 

     child[_dataField] = value; 
    } 
} 

var myDataProvider:HierarchicalData = /* your data provider */; 

// Call it like this... 
setCheckBoxValue(myDataProvider.source, cb.selected); 

更新:要回答你的第二个问题......

  1. 创建一个新的CheckBoxColumn,它延伸AdvancedDataGridColumn。您可以使用它来预配置您的headerRendereritemRenderer
  2. 在您的自定义项目渲染器中,您可以像下面这样获得列:
    grid = AdvancedDataGrid(listData.owner); 
    column = grid.columns[listData.columnIndex] as CheckBoxColumn;
  3. 在您的标题渲染器中执行相同的操作。
  4. 每当您的某个项目渲染器中的CheckBox值发生变化时,都会通过您的列发送事件。例如:column.dispatchEvent(new Event("checkBoxValueChanged"));
  5. 你的头渲染应该添加一个事件监听器到“checkBoxValueChanged”事件的列(或者任何你称之为的)。无论何时该事件被触发循环遍历数据提供者并相应地更新标题复选框。

理论上说应该有效。 HTH

+0

这很好,谢谢。我现在面临的问题是当我取消选择项目渲染器中的复选框时,取消选中标题渲染器中的复选框。我发现了几个在线示例,但似乎没有任何工作。你知道如何将这些值连接在一起吗?即使是理论上的解释也会有很大的帮助。 – fumeng 2011-01-07 18:35:07