views:

976

answers:

1

In a previous application that I had written, I had a Class that extended AdvancedDataGrid (ADG). It contained the following code:

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

In this implementation, the function setOpenNodes() worked fine - it did exactly what I intended it to do - pass it a number, and open all nodes in the dataProvider at or below that level.

Now, I am creating a new ADG Class and want to reproduce this functionality:

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

The dataProvider is set in the parent component:

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

reportData is set in another file:

reportData = new HierarchicalData(resultXML.children);

However, I am getting runtime errors:

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

I've tried casting dataProvider as ICollectionView. I've tried then casting the ICollectionView as IHierarchicalCollectionView. I've tried all sorts of casting, but nothing seems to work. Why won't this work in this new implementation as it did in the past implementation? What do I need to do?

*** Update:

I started debugging this. I added an override setter to my ADG Class to see when dataProvider was being set:

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

I added a breakpoint to this setter and to my setOpenNodes() function. Sure enough, the dataProvider is being set BEFORE setOpenNodes() is called, and it is HierarchicalData. But, when the setOpenNodes() the debugger says that the dataProvider is a null ArrayCollection. It seems like this is the root issue.

+1  A: 

I needed to call commitProperties before attempting to access the dataProvider property.

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