如何从AdvancedDataGrid的dataProvider创建分层光标?

时间:2009-03-09 19:42:35

标签: flex actionscript-3 hierarchical-data advanceddatagrid cursors

在我之前编写的应用程序中,我有一个扩展 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() 工作正常 - 它完全按照我的意图执行 - 传递一个数字,并打开 {{中的所有节点1}} 等级或低于该等级。

现在,我正在创建一个新的ADG类,并希望重现此功能:

dataProvider

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 。我尝试了各种各样的铸造,但似乎没有任何效果。为什么这不会像过去的实现一样在这个新的实现中工作?我需要做什么?

***更新:

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

IHierarchicalCollectionView

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

1 个答案:

答案 0 :(得分: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();
}