0

グループ化コレクションを含む高度なデータグリッドを持つFlexアプリケーションがあります。画面で最初にすべてのノードを閉じてほしい。そこから、ユーザーは1つまたは2つを開いて、その中の情報を表示することを選択できます。ノードの子の1つをクリックすると、ビュースタックを使用するビューが、その子に関する詳細情報を含む画面に変更されます。ただし、最初の画面に戻ると、すべてのノードが再び閉じられた状態で戻ります。

アプリに、開いたままになっているノードと最後にクリックしたアイテムを記憶させ、強調表示してもらいたいです。

IHierarchicalCollectionView(dataProviderName).openNodesを使用して、ビューが変更されたとき、およびこのオブジェクトを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

この質問に出くわしたばかりで、最近同じ問題に遭遇しました。遅いことはわかっていますが、インターネットのためにこれがうまくいきました。

私は(最終的に)ここで答えを見つけました

そのため、2 つの部分があり、最初にデータが更新される場所で、最初に開いているノードの階層ビューを取得し、グループ化コレクションが更新された後にこれを復元します。

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 に答える