1

我正在为高级数据网格进行缩进和缩进。我有一组函数在对底层数据进行操作时可以正常工作,但是在对数据网格的选定项目进行操作时会抛出“错误:书签不再有效”。

当我运行此代码时,它运行良好:

indentLeaf(l5)
outdentLeaf(l4)

但是这段代码失败了:

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

该代码并非在所有情况下都失败,仅针对数据网格数据树的某些配置。

如果要查看抛出的错误,代码需要在 Flash 播放器的调试器版本中运行。我已经剪切并粘贴了我进入文本区域的错误以供参考以及以下内容。

抛出异常时,玩具应用程序中的代码似乎恢复正常,但在我较大的应用程序中,它会导致严重崩溃。

打开查看源代码的示例代码可以在这里找到:http://www.crcarlson.com/adg/ADGArrayCollectionUpdate.swf

要创建错误,请重置树,然后单击“indent/outdent2”

我将不胜感激有关如何解决此问题的任何建议。

完整的堆栈跟踪如下所示:

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()”getter。

它不会捕获由无效书签引起的 CursorError。

第一步是创建一个更好的游标类:

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

Sami关于内部(HierarchicalCollectionViewCursor)变得混乱的说法是正确的。这是 Flex 框架中长期存在的错误之一。它最近在FLEX-34119及其所有链接票证中记录并修复。它应该在 Flex SDK 4.14 中可用,这意味着从那时起不再需要任何变通方法。

于 2014-08-27T11:33:53.310 回答
0

这个 Exeption 可能发生在带有 HierarchicalData 的 Flex AdvancedDatagrid 中。当项目添加到 Dataprovider 时,它会通知 datagrid 。每次将项目添加到数据网格时,数据网格都会收到集合更改事件。然后一些数据网格内部可能会被搞砸。您可以禁用自动 ArayCollecion 刷新:

    dataprovider.disableAutoUpdate();

当您的数据网格准备好使用刷新数据网格渲染时:

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

我希望这将有所帮助。

于 2013-04-19T13:40:22.463 回答