0

我有一个 Flex 应用程序,它有一个包含分组集合的高级数据网格。我希望屏幕最初关闭所有节点。从那里,用户可以选择打开一个或两个并查看其中的信息。如果单击其中一个节点子项,则会使用视图堆栈将视图更改为包含有关该子项的更多信息的屏幕。但是,当我们返回初始屏幕时,它会再次关闭所有节点。

我希望应用程序记住哪些节点保持打开状态以及最后单击的项目是什么,并将其突出显示。

我已经尝试使用 IHierarchicalCollectionView(dataProviderName).openNodes 并将其分配给一个对象,当视图发生变化时以及当它返回 Assisning 这个对象给 IHierarchicalCollectionView(dataProviderName).openNodes 时。但该应用程序似乎进入了一个循环,IE 停止响应。

这是我的 DataGrid 的代码。任何帮助,将不胜感激。

    public class SummaryGridBase extends AdvancedDataGrid
{

    [Bindable]
    protected var _modelLocator:ModelLocator = ModelLocator.getInstance();

    [Bindable]
    override public function set dataProvider(value:Object):void
    {
        super.dataProvider = value;
    }

    override protected function collectionChangeHandler(event:Event):void
    {
        super.collectionChangeHandler(event);
        trace("Summary Grid Trace 1");
        if( event is CollectionEvent && (event as CollectionEvent).kind == CollectionEventKind.REFRESH )
        {
            trace("Summary Grid Trace 2");
            this.validateGridAndExpand();
        }           
    }

    private function validateGridAndExpand():void
    {
        this.validateNow();
        var rootLevel:ArrayCollection = ModelLocator.getInstance().groupingCollection.getRoot() as ArrayCollection;
        for each( var item:Object in rootLevel )
        {
            this.expandItem( item, true, false );
        }
    }

    protected function changeHandler(event:ListEvent):void
    {
        trace("Change in Summary Data Selection" +(this.selectedItem.Business));
        if( this.selectedItem.Business == null )
        {
            trace("Im Null");
            Alert.show( "Please Expand a Vendor Using The Arrow Beside it \nand Select a Polymer From the List", 'Warning', mx.controls.Alert.OK);
        }
        else
        {
            var summaryEvent:SummaryEvent = new SummaryEvent( SummaryEvent.SELECT_SUMMARY, (this.selectedItem.Business as String), (this.selectedItem.Op_Site as String),(this.selectedItem.Vendor as String),(this.selectedItem.Item_Desc as String) );
            summaryEvent.dispatch();
        }
    }

    public function SummaryGridBase()
    {
        super();
    }
}
4

1 回答 1

1

我只是偶然发现了这个问题,最近遇到了同样的问题。我知道为时已晚,但为了互联网,这对我有用。

我(最终)在这里找到了答案

所以有两个部分,首先更新数据的地方,您首先获取打开哪些节点的分层视图,并在更新分组集合后恢复它:

var hierarchical:IHierarchicalCollectionView = advDatagrid.dataProvider as IHierarchicalCollectionView;

var openNodes:Object = hierarchical.openNodes;

grpCollection.refresh();

advDatagrid.dataProvider = grpCollection;
advDatagrid.validateNow();
IHierarchicalCollectionView(advDatagrid.dataProvider).openNodes = openNodes;

但另一部分是设置分组对象功能。

所以在你的分组定义中:

<mx:GroupingCollection2 id="grpCollection" source="{data}">
<mx:Grouping groupingObjectFunction="grpObjFunc">
    <mx:GroupingField name="name"/>
</mx:Grouping>

还有一个返回唯一 id 的简单函数:

    private function grpObjFunc(value:String):Object
{
    return {uid:value};
}
于 2012-08-16T11:04:02.310 回答