Pergunta

Em um pedido anterior que eu tinha escrito, eu tinha uma classe que se estendeu AdvancedDataGrid (ADG). Ele continha o seguinte código:

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

Nesta implementação, a função setOpenNodes() bem trabalhado - ele fez exatamente o que eu pretendia que fazer - passá-lo um número, e abrir todos os nós do dataProvider no ou abaixo desse nível.

Agora, eu estou criando uma nova classe ADG e quer reproduzir essa funcionalidade:

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

O dataProvider é definido no componente pai:

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

reportData está definido em outro arquivo:

reportData = new HierarchicalData(resultXML.children);

No entanto, estou recebendo erros de execução:

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

Eu tentei dataProvider como ICollectionView . Eu tentei, em seguida, lançar o ICollectionView como IHierarchicalCollectionView . Eu tentei todos os tipos de fundição, mas nada parece funcionar. Por que não vai funcionar isso nesta nova implementação, como o fez na implementação passado? O que eu preciso fazer?

*** Update:

Eu comecei a depuração isso. Eu adicionei um setter substituição ao meu ADG Classe para ver quando dataProvider a ser criado:

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

Eu adicionei um ponto de interrupção a este setter e aos meus setOpenNodes function (). o suficiente certeza, o dataProvider está sendo definido ANTES setOpenNodes () é chamado, e é HierarchicalData. Mas, quando os setOpenNodes () o depurador diz que o dataProvider é um ArrayCollection nulo. Parece que esta é a raiz do problema.

Foi útil?

Solução

Eu precisava chamar commitProperties antes de tentar acessar a propriedade 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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top