Question

Dans une application précédente que j'avais écrite, j'avais une classe étendue AdvancedDataGrid (ADG). Il contenait le code suivant:

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();
        }
    }
}

Dans cette implémentation, la fonction setOpenNodes () a bien fonctionné - elle a fonctionné exactement comme je le voulais, transmettez-lui un nombre et ouvrez tous les nœuds du fournisseur de données égal ou inférieur à ce niveau.

Maintenant, je crée une nouvelle classe ADG et souhaite reproduire cette fonctionnalité:

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();
        }
    }
}

Le fournisseur de données est défini dans le composant parent:

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

reportData est défini dans un autre fichier:

reportData = new HierarchicalData(resultXML.children);

Cependant, des erreurs d'exécution se produisent:

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

J'ai essayé de convertir fournisseur de données en tant que ICollectionView . J'ai ensuite essayé de convertir ICollectionView en tant que IHierarchicalCollectionView . J'ai essayé toutes sortes de casting, mais rien ne semble fonctionner. Pourquoi cela ne fonctionne-t-il pas dans cette nouvelle implémentation comme dans la mise en œuvre précédente? Que dois-je faire?

*** Mise à jour:

J'ai commencé à déboguer ceci. J'ai ajouté un configurateur de remplacement à ma classe ADG pour savoir quand dataProvider était défini:

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

J'ai ajouté un point d'arrêt à ce setter et à ma fonction setOpenNodes (). Effectivement, le fournisseur de données est défini AVANT que la méthode setOpenNodes () soit appelée, et il s'agit de HierarchicalData. Mais, lorsque le débogueur setOpenNodes () dit que le fournisseur de données est un ArrayCollection null. Il semble que ce soit le problème fondamental.

Était-ce utile?

La solution

J'avais besoin d'appeler commitProperties avant de tenter d'accéder à la propriété 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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top