1

In einer früheren Anwendung, die ich geschrieben hatte, hatte ich eine Klasse, die AdvancedDataGrid (ADG) erweitert. Es enthielt den folgenden Code:Wie erstelle ich einen hierarchischen Cursor aus dem DataProvider eines AdvancedDataGrid?

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 dieser Implementierung die Funktion setOpenNodes() fein gearbeitet - es tat genau das, was ich zu tun gedachte - gibt ihnen eine Zahl, und öffnen Sie alle Knoten in den dataProvider bei oder unter dieser Ebene.

Nun, ich bin eine neue ADG Klasse zu schaffen und will diese Funktionalität reproduzieren:

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

Die dataProvider in der übergeordneten Komponente gesetzt wird:

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

reportData gesetzt in einer anderen Datei:

Allerdings

, erhalte ich Laufzeitfehler:

TypeError: Error #1034: Type Coercion failed: cannot convert [email protected] to mx.collections.IHierarchicalCollectionViewCursor. 

Ich habe Casting versucht dataProvider als ICollectionView. Ich habe dann versucht, die ICollectionView als IHierarchicalCollectionView Gießen. Ich habe alle möglichen Castings ausprobiert, aber nichts scheint zu funktionieren. Warum funktioniert das nicht in dieser neuen Implementierung wie in der vorherigen Implementierung? Was muss ich tun?

*** Update:

Ich begann das Debuggen. Ich fügte hinzu, eine Überschreibung Setter meiner ADG Klasse zu sehen, wenn Datenprovider eingestellt wurde:

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

ich einen Haltepunkt zu diesen Setter hinzugefügt und zu meinen setOpenNodes() Funktion. Tatsächlich wird der Datenprovider VOR dem Aufruf von setOpenNodes() gesetzt, und es ist HierarchicalData. Aber, wenn der setOpenNodes() der Debugger sagt, dass der DataProvider eine Null ArrayCollection ist. Es scheint, dass dies das Grundproblem ist.

Antwort

1

Ich musste commitProperties aufrufen, bevor ich auf die Eigenschaft dataProvider zugreifen konnte.

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