1

高度なデータグリッドのインデントとアウトデントに取り組んでいます。基になるデータを正常に操作すると機能する一連の関数がありますが、データグリッドの選択したアイテムを操作すると「エラー:ブックマークが無効になりました」をスローします。

このコードを実行すると、正常に実行されます。

indentLeaf(l5)
outdentLeaf(l4)

しかし、このコードは失敗します:

adg.selectedItem = l5
indentLeaf(adg.selectedItem as Leaf)
adg.selectedItem = l4
outdentLeaf(adg.selectedItem as Leaf)

コードはすべてのインスタンスで失敗するわけではなく、データグリッドデータツリーの一部の構成でのみ失敗します。

スローされたエラーを確認するには、フラッシュプレーヤーのデバッガーバージョンでコードを実行する必要があります。以下と同様に、参照用にテキスト領域に入力したエラーを切り取って貼り付けました。

おもちゃのアプリのコードは、例外がスローされたときに正常に回復するようですが、私の大きなアプリでは、ハードクラッシュが発生します。

サンプルコードは、ビューソースがオンになっている場合にここにあります。http://www.crcarlson.com/adg/ADGArrayCollectionUpdate.swf

エラーを作成するには、ツリーをリセットしてから「インデント/アウトデント2」をクリックします

これを回避する方法についての提案をいただければ幸いです。

完全なスタックトレースは次のようになります。

Error: Bookmark no longer valid.
at ListCollectionViewCursor/seek()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:2417]
at mx.collections::HierarchicalCollectionViewCursor/get current()[E:\dev\4.x\frameworks\projects\datavisualization\src\mx\collections\HierarchicalCollectionViewCursor.as:220]
at mx.collections::HierarchicalCollectionViewCursor/collectionChangeHandler()[E:\dev\4.x\frameworks\projects\datavisualization\src\mx\collections\HierarchicalCollectionViewCursor.as:1143]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.collections::HierarchicalCollectionView/nestedCollectionChangeHandler()[E:\dev\4.x\frameworks\projects\datavisualization\src\mx\collections\HierarchicalCollectionView.as:1595]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.collections::ListCollectionView/dispatchEvent()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1024]
at mx.collections::ListCollectionView/handlePropertyChangeEvents()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1433]
at mx.collections::ListCollectionView/listChangeHandler()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1300]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.collections::ArrayList/internalDispatchEvent()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ArrayList.as:673]
at mx.collections::ArrayList/itemUpdateHandler()[E:\dev\4.x\frameworks\projects\framework\src\mx\collections\ArrayList.as:704]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at Leaf/dispatchChildrenChanged()[C:\adobeFlexTraining\_workspace\ADGArrayCollectionUpdate\src\Leaf.as:119]
at Leaf/addChildAt()[C:\adobeFlexTraining\_workspace\ADGArrayCollectionUpdate\src\Leaf.as:63]
at Leaf/move()[C:\adobeFlexTraining\_workspace\ADGArrayCollectionUpdate\src\Leaf.as:96]
at ADGArrayCollectionUpdate/outdentLeaf()[C:\adobeFlexTraining\_workspace\ADGArrayCollectionUpdate\src\ADGArrayCollectionUpdate.mxml:86]
at ADGArrayCollectionUpdate/IO2_clickHandler()[C:\adobeFlexTraining\_workspace\ADGArrayCollectionUpdate\src\ADGArrayCollectionUpdate.mxml:113]
at ADGArrayCollectionUpdate/__IO2_click()[C:\adobeFlexTraining\_workspace\ADGArrayCollectionUpdate\src\ADGArrayCollectionUpdate.mxml:183]
4

3 に答える 3

4

このバグの回避策を見つけました(SDK 3.5を使用していますが、4.1の修正はほとんど同じだと思います)。問題は、HierarchicalCollectionViewCursorクラスの「current()」ゲッターにあります。

無効なブックマークが原因で発生したCursorErrorはキャッチされません。

ステップ1は、より適切なカーソルクラスを作成することです。

public class HierarchicalCollectionViewCursor2 extends HierarchicalCollectionViewCursor
{
    public function HierarchicalCollectionViewCursor2(collection:HierarchicalCollectionView, model:ICollectionView, hierarchicalData:IHierarchicalData)
    {
        super(collection, model, hierarchicalData);
    }


    override public function get current() : Object
    {
        // original HierarchicalCollectionViewCursor class fails to catch the "bookmark no
        // longer valid" Error, which is thrown as a CollectionViewError instance in ListCollectionView,
        // but transformed to a CursorError within the same class
        try {
            var result:Object = super.current;
        }
        catch (e:CursorError) {
            result = null;
        }

        // done
        return result;
    }
}

ステップ2は、新しいカーソルを返すHierarchicalCollectionViewクラスを作成することです。

use namespace mx_internal;

public class HierarchicalCollectionView2 extends HierarchicalCollectionView
{
    public function HierarchicalCollectionView2(hierarchicalData:IHierarchicalData=null, argOpenNodes:Object=null)
    {
        super(hierarchicalData, argOpenNodes);
    }


    override public function createCursor() : IViewCursor
    {
        return new HierarchicalCollectionViewCursor2(this, treeData, this.source);
    }
}

ステップ3は、その新しいHierarchicalCollectionView2クラスをデータプロバイダーとして実際に使用することです。

var itemsAC:ArrayCollection = new ArrayCollection();
// add items etc
this.adgDataProvider = new HierarchicalCollectionView2(new HierarchicalData(itemsAC));

これで、すべてが順調に進んでいると思うでしょうが、別の厄介なFlex-SDKバグがなければ、ドラマは完成しません。この場合、その:

https://bugs.adobe.com/jira/browse/FLEXDMV-1846

したがって、ステップ4は、バグの問題で説明されているようにAdvancedDataGridコンポーネントをサブクラス化することです。

それだけです-私のために働きます!

于 2011-02-28T11:57:46.173 に答える
0

この例外は、HierarchicalDataを使用するFlexAdvancedDatagridで発生する可能性があります。アイテムがDataproviderに追加されると、データグリッドに通知されます。datagridは、アイテムが追加されるたびにコレクション変更イベントを受け取ります。その後、一部のDatagrid内部が混乱する可能性があります。自動ArayCollecion更新を無効にすることができます:

    dataprovider.disableAutoUpdate();

そして、datagridがrefresh datagridレンダリングを使用する準備ができたら:

    if (advancedDataGrid) {
            advancedDataGrid.invalidateList();
            advancedDataGrid.invalidateDisplayList();
            advancedDataGrid.expandAll();
        }

これがお役に立てば幸いです。

于 2013-04-19T13:40:22.463 に答える
0

Samiは、(HierarchicalCollectionViewCursorの)内部がめちゃくちゃになることについて正しかった。これは、Flexフレームワークで最も長く続いているバグの1つでした。最近、FLEX-34119とそれにリンクされたすべてのチケットで文書化され、修正されました。Flex SDK 4.14で利用できるはずです。つまり、それ以降は回避策は必要ありません。

于 2014-08-27T11:33:53.310 に答える