高级数据网格:错误:书签不再有效

时间:2010-12-01 02:25:39

标签: flex advanceddatagrid

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

当我运行此代码时,运行正常:

indentLeaf(l5)
outdentLeaf(l4)

但是这段代码失败了:

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

代码在所有实例中都不会失败,仅适用于数据网格数据树的某些配置。

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

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

此处可以找到示例代码,并启用了视图来源: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]

3 个答案:

答案 0 :(得分:4)

我刚刚找到了这个bug的解决方法(我使用的是SDK 3.5,但我认为4.1修复程序会非常相似)。问题在于HierarchicalCollectionViewCursor类的“current()”getter。

它不会捕获由无效书签引起的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组件。

就是这样 - 对我有用!

答案 1 :(得分:0)

此Exeption可以在具有HierarchicalData的Flex AdvancedDatagrid中使用。 将项目添加到Dataprovider时,它会通知datagrid。每次将项添加到数据网格时,数据网格都会收到集合更改事件。然后,某些数据网格内部可能会混乱。 您可以禁用自动ArayCollecion刷新:

    dataprovider.disableAutoUpdate();

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

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

我希望这会有所帮助。

答案 2 :(得分:0)

Sami关于内部(HierarchicalCollectionViewCursor)搞砸是正确的。这是Flex框架中最长期存在的错误之一。最近记录了 - 并修复了 - FLEX-34119及其所有链接的门票。它应该在Flex SDK 4.14中可用,这意味着从那时起不需要解决方法。