1

在我之前编写的应用程序中,我有一个扩展类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.

我试过铸造dataProviderICollectionView. 我试过然后铸造ICollectionViewas IHierarchicalCollectionView。我尝试了各种铸造,但似乎没有任何效果。为什么这在这个新的实现中不能像在过去的实现中那样工作?我需要做什么?

*** 更新:

我开始调试这个。我在我的 ADG 类中添加了一个覆盖设置器,以查看何时设置了 dataProvider:

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

我在这个设置器和我的 setOpenNodes() 函数中添加了一个断点。果然,dataProvider 是在调用 setOpenNodes() 之前设置的,它是 HierarchicalData。但是,当 setOpenNodes() 调试器说 dataProvider 是一个空的 ArrayCollection 时。看来这是根本问题。

4

1 回答 1

1

在尝试访问 dataProvider 属性之前,我需要调用 commitProperties。

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();
}
于 2009-03-10T14:19:45.473 回答