【问题标题】:CheckBox header renderer with HierarchicalCollectionView带有 HierarchicalCollectionView 的 CheckBox 标头渲染器
【发布时间】:2011-01-07 15:43:24
【问题描述】:

我已经获得了一个复选框标题渲染器,可以很好地与平面 DP 配合使用,但是 分层集合视图是另一回事。单击时,我希望它全选 给定列中的复选框。这是我的代码:

var dp:HierarchicalCollectionView = _dataGrid.dataProvider as 分层集合视图; var testDp:GroupingCollection = dp.source as GroupingCollection; var rawDp:ArrayCollection = testDp.source as ArrayCollection;

for(var i:int=0 ; i

它选择第二级数据的所有复选框,但不选择顶部 数据级别。我在这里想念什么?好像没找到。

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

【问题讨论】:

    标签: apache-flex actionscript flashbuilder4


    【解决方案1】:

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

    var dp:IHierarchicalCollectionView = _dataGrid.hierarchicalCollectionView;
    var cursor:IViewCursor= dp.createCursor();
    
    while (!cursor.afterLast)
    {
        cursor.current[_dataField] = cb.selected;
        cursor.moveNext();
    }
    

    但是,这仅适用于先前已打开的节点。所以要么用_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. 创建一个扩展AdvancedDataGridColumn 的新CheckBoxColumn。您可以使用它来预配置您的headerRendereritemRenderer
    2. 在您的自定义项目渲染器中,您可以像这样获取您的列:
      grid = AdvancedDataGrid(listData.owner);
      column = grid.columns[listData.columnIndex] as CheckBoxColumn;
    3. 在标题渲染器中执行相同操作。
    4. 每当您的一个项目渲染器中的 CheckBox 值发生更改时,都会通过您的列调度一个事件。比如:column.dispatchEvent(new Event("checkBoxValueChanged"));
    5. 您的标题渲染应该为“checkBoxValueChanged”事件(或您所称的任何名称)的列添加一个事件侦听器。每当触发该事件时,都会通过您的数据提供程序循环并相应地更新标头 CheckBox。

    理论上应该可以。高温

    【讨论】:

    • 效果很好,谢谢。我现在面临的问题是当我取消选择项目渲染器中的复选框时,取消选择标题渲染器中的复选框。我找到了几个在线示例,但似乎都没有。你知道如何将这些价值观联系在一起吗?即使是理论上的解释也会有很大帮助。
    • 我会编写一个自定义列以及一个自定义项渲染器。每个单元格的项目渲染器(CheckBox)可以通过列调度更改事件。标题渲染器可以从列中侦听这些事件。
    • 这就是我一直在尝试从我的 itemRenderer 的更改处理程序中做的事情:
    • 数据[_dataField] = cb.selected; var dp:IHierarchicalCollectionView = _dataGrid.hierarchicalCollectionView 作为 IHierarchicalCollectionView; dp.dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE));
    • 首先,我不会使用 CollectionEvent 来发出这样的信号。这可能会产生一些奇怪的副作用......至少对这些事情使用自定义事件。其次,我更新了我的答案。我已经概述了您应该实现的基本内容。那应该让你开始。顺便说一句:不要忘记将此答案标记为有用。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多