Como faço para criar um hierárquica Cursor do dataProvider de um AdvancedDataGrid?
-
06-07-2019 - |
Pergunta
Em um pedido anterior que eu tinha escrito, eu tinha uma classe que se estendeu AdvancedDataGrid
(ADG). Ele continha o seguinte código:
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();
}
}
}
Nesta implementação, a função setOpenNodes()
bem trabalhado - ele fez exatamente o que eu pretendia que fazer - passá-lo um número, e abrir todos os nós do dataProvider
no ou abaixo desse nível.
Agora, eu estou criando uma nova classe ADG e quer reproduzir essa funcionalidade:
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();
}
}
}
O dataProvider
é definido no componente pai:
<view:ReportADG id="reportADG" dataProvider="{reportData}" />
reportData
está definido em outro arquivo:
reportData = new HierarchicalData(resultXML.children);
No entanto, estou recebendo erros de execução:
TypeError: Error #1034: Type Coercion failed: cannot convert ListCollectionViewCursor@6f14031 to mx.collections.IHierarchicalCollectionViewCursor.
fundição Eu tentei dataProvider
como ICollectionView
. Eu tentei, em seguida, lançar o ICollectionView
como IHierarchicalCollectionView
. Eu tentei todos os tipos de fundição, mas nada parece funcionar. Por que não vai funcionar isso nesta nova implementação, como o fez na implementação passado? O que eu preciso fazer?
*** Update:
Eu comecei a depuração isso. Eu adicionei um setter substituição ao meu ADG Classe para ver quando dataProvider a ser criado:
override public function set dataProvider(value:Object):void
{
super.dataProvider = value;
}
Eu adicionei um ponto de interrupção a este setter e aos meus setOpenNodes function (). o suficiente certeza, o dataProvider está sendo definido ANTES setOpenNodes () é chamado, e é HierarchicalData. Mas, quando os setOpenNodes () o depurador diz que o dataProvider é um ArrayCollection nulo. Parece que esta é a raiz do problema.
Solução
Eu precisava chamar commitProperties antes de tentar acessar a propriedade dataProvider.
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();
}