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.

dataProviderとしてキャストしてみましたICollectionViewICollectionViewasをキャストしてみましたIHierarchicalCollectionView。あらゆる種類のキャストを試しましたが、何も機能していないようです。以前の実装のように、この新しい実装でこれが機能しないのはなぜですか? 私は何をする必要がありますか?

*** アップデート:

これをデバッグし始めました。dataProvider がいつ設定されているかを確認するために、ADG クラスにオーバーライド セッターを追加しました。

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

このセッターと setOpenNodes() 関数にブレークポイントを追加しました。案の定、dataProvider は setOpenNodes() が呼び出される前に設定されており、それは HierarchicalData です。ただし、setOpenNodes() を実行すると、デバッガーは dataProvider が null 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 に答える