Как мне создать Иерархический Курсор из dataProvider в AdvancedDataGrid? - PullRequest
1 голос
/ 09 марта 2009

В предыдущем приложении, которое я написал, у меня был класс, который расширился AdvancedDataGrid (ADG). Он содержал следующий код:

package
{
    public class CustomADG extends AdvancedDataGrid
    {
        ....

        // This function serves as the result handler for a webservice call that retrieves XML data.
        private function webServiceResultHandler(event:ResultEvent):void
        {
            var resultXML:XML = new XML(event.result);

            dataProvider = new HierarchicalData(resultXML.children);
        }

        ....

        public function setOpenNodes(maxDepth:int = 0):void
        {
            var dataCursor:IHierarchicalCollectionViewCursor = dataProvider.createCursor();

            while (dataCursor.current != null)
            {
                if (dataCursor.currentDepth < maxDepth)
                    dataProvider.openNode(dataCursor.current);

                dataCursor.moveNext();
            }

            dataProvider.refresh();
        }
    }
}

В этой реализации функция setOpenNodes() работала нормально - она ​​сделала именно то, что я и собиралась сделать - передала ей число и открыла все узлы в dataProvider на этом уровне или ниже.

Теперь я создаю новый класс ADG и хочу воспроизвести эту функцию:

package view
{
    import mx.collections.IHierarchicalCollectionViewCursor;

    public class ReportADG extends AdvancedDataGrid
    {
        public function ReportADG()
        {
            super();
        }

        public function setOpenNodes(maxDepth:int = 0):void
        {
            var dataCursor:IHierarchicalCollectionViewCursor = 
                dataProvider.createCursor();

            while (dataCursor.current != null)
            {
                if (dataCursor.currentDepth < maxDepth)
                    dataProvider.openNode(dataCursor.current);

                dataCursor.moveNext();
            }

            dataProvider.refresh();
        }
    }
}

dataProvider устанавливается в родительском компоненте:

<view:ReportADG id="reportADG" dataProvider="{reportData}" />

reportData устанавливается в другом файле:

reportData = new HierarchicalData(resultXML.children);

Однако я получаю ошибки времени выполнения:

TypeError: Error #1034: Type Coercion failed: cannot convert ListCollectionViewCursor@6f14031 to mx.collections.IHierarchicalCollectionViewCursor.

Я пробовал кастовать dataProvider как ICollectionView. Я попытался затем разыграть ICollectionView как IHierarchicalCollectionView. Я пробовал все виды кастинга, но ничего не получается. Почему это не будет работать в этой новой реализации, как это было в прошлой реализации? Что мне нужно сделать?

*** Обновление:

Я начал отлаживать это. Я добавил установщик переопределения в мой класс ADG, чтобы увидеть, когда устанавливается dataProvider:

override public function set dataProvider(value:Object):void
{
    super.dataProvider = value;
}

Я добавил точку останова для этого установщика и для моей функции setOpenNodes (). Конечно, dataProvider устанавливается перед вызовом setOpenNodes (), и это HierarchicalData. Но когда setOpenNodes () отладчик говорит, что dataProvider является нулевым ArrayCollection. Похоже, это коренная проблема.

1 Ответ

1 голос
/ 10 марта 2009

Мне нужно было вызвать commitProperties, прежде чем пытаться получить доступ к свойству dataProvider.

public function setOpenNodes(maxDepth:int = 0):void
{
    super.commitProperties();

    var dataCursor:IHierarchicalCollectionViewCursor = 
        dataProvider.createCursor();

    while (dataCursor.current != null)
    {
        if (dataCursor.currentDepth < maxDepth)
            dataProvider.openNode(dataCursor.current);

        dataCursor.moveNext();
    }

    dataProvider.refresh();
}
...