2010-12-01 6 views
1

高度なデータグリッドのインデントとアウトデントの作業中です。私は基になるデータを操作するときに機能する一連の関数を持っていますが、データグリッドの選択された項目を操作するときには "エラー:ブックマークは有効ではなくなりました"アドバンストデータグリッド:エラー:ブックマークが無効になった

indentLeaf(l5) 
outdentLeaf(l4) 

しかし、このコードは失敗します:私はこのコードを実行すると

それが正常に動作します

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

コードが唯一のデータグリッドデータのいくつかの構成のために、すべてのインスタンスで失敗しません木。

スローされたエラーを表示するには、デバッガ版のFlash Playerでコードを実行する必要があります。私は、以下のように参照用にテキストエリアに入るエラーを切り取って貼り付けました。

例外がスローされると、おもちゃアプリのコードは正常に復旧したようですが、大きなアプリではハードクラッシュにつながります。私が取得する方法上の任意の提案をいただければ幸いです、エラーを作成し、ツリーをリセットしてから、「インデント/ outdent2」をクリックしhttp://www.crcarlson.com/adg/ADGArrayCollectionUpdate.swf

を:ビューソースがオンになって

例のコードはここで見つけることができますこの周り。

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

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] 
+0

私は同じ問題を抱えています。それは私のアプリケーションのショーストッパーです。これについて進歩しましたか?私が何かを見つけるとすぐ、私はそれをここに掲示するでしょう。乾杯。 – Tom

答えて

4

私は(私はSDK 3.5を使用していますが、私は4.1修正プログラムは非常に同じになると思います)このバグの回避策を見つけました。この問題は、HierarchicalCollectionViewCursorクラスの "current()"ゲッター内にあります。

無効なブックマークに起因するCursorErrorを捕捉しません。

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

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実際にそれを使用することである。

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クラスを作成することです新しい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コンポーネントをサブクラス化することです。

それは私の作品です!

+0

素晴らしいです、この回答を投稿する時間をとっていただきありがとうございます。私はしばらくの間そこに夢中になっていたと思った... – crcarlson

+0

確かに恐ろしい - これはフィルターを更新するのに使用すると痛みを感じました。技術的には、これがHCV2のすべてであれば、元のHCVを拡張するためADGのオーバーライドは必要ありませんが、別のスーパークラスから自分自身をロールすると問題になります。 –

+0

FLEXDMV-1846へのリンクが壊れています。バグは修正されましたか?もしそうでなければ、何をする必要がありますか? –

0

このExeptionは、HierarchicalDataを使用するFlex AdvancedDatagridで発生する可能性があります。 アイテムがDataproviderに追加されると、アイテムはDataGridに通知されます。アイテムが追加されるたびにデータグリッドはコリジョン変更イベントを受け取ります。それで、一部のDatagrid内部が乱れる可能性があります。 あなたは自動ArayCollecionリフレッシュ無効にできます。私はこれが役立つことを願っています

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

dataprovider.disableAutoUpdate(); 

を、あなたがDataGridの時にリフレッシュデータグリッドのレンダリングを使用する準備ができています。

0

Samiは、(HierarchicalCollectionViewCursorの)内部構造がうまくいきませんでした。これは、Flexフレームワークで最も長年にわたるバグの1つでした。最近発表されたのは、FLEX-34119とそのリンク先のチケットです。これは、Flex SDK 4.14で利用できるはずです。つまり、その時点以降は回避策は必要ありません。

関連する問題