Расширенная таблица данных: ошибка: закладка больше не действительна - PullRequest
1 голос
/ 01 декабря 2010

Я работаю над отступом и отступом для расширенной сетки данных. У меня есть набор функций, которые работают при точной работе с базовыми данными, но выдают «Ошибка: закладка больше не действительна» при работе с выбранными элементами сетки данных.

Когда я запускаю этот код, он работает нормально:

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

Чтобы создать ошибку, сбросьте дерево и нажмите «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 ]

4 голосов
/ 28 февраля 2011

Я только что нашел обходной путь для этой ошибки (я использую SDK 3.5, но я думаю, что исправление 4.1 было бы почти таким же).Проблема заключается в методе «current ()» класса HierarchicalCollectionViewCursor.

Он не перехватывает CursorError, вызванную недопустимой закладкой.

Шаг 1 - создать лучший курсорclass:

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, как описано в проблеме с ошибкой.

Вот и все - работает для меня!

0 голосов
/ 27 августа 2014

Сами был прав насчет внутреннего (HierarchicalCollectionViewCursor) путаницы.Это была одна из самых давних ошибок в среде Flex.Это было недавно задокументировано и исправлено на FLEX-34119 и всех связанных с ним билетах.Он должен быть доступен во Flex SDK 4.14, что означает, что с этого момента обходного пути не потребуется.

0 голосов
/ 19 апреля 2013

Это исключение может происходить в Flex AdvancedDatagrid с HierarchicalData. Когда элементы добавляются в поставщик данных, он уведомляет сетку данных. Сетка данных получает события изменения коллекции каждый раз, когда к ней добавляются элементы. Тогда некоторые внутренние данные могут быть испорчены. Вы можете отключить автоматическое обновление ArayCollecion:

    dataprovider.disableAutoUpdate();

и когда ваша сетка данных готова к использованию обновления рендеринга сетки данных:

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

Надеюсь, это поможет.

...