Как создать иерархический курсор из dataProvider в AdvancedDataGrid?
В предыдущем приложении, которое я написал, у меня был класс, который был расширен 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();
}
}
}
В этой реализации функция 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
как ICollectionView
, Я пытался затем бросить ICollectionView
как IHierarchicalCollectionView
, Я пробовал все виды кастинга, но ничего не получается. Почему это не будет работать в этой новой реализации, как это было в прошлой реализации? Что мне нужно сделать?
*** Обновить:
Я начал отлаживать это. Я добавил установщик переопределения в мой класс ADG, чтобы увидеть, когда устанавливается dataProvider:
override public function set dataProvider(value:Object):void
{
super.dataProvider = value;
}
Я добавил точку останова к этому сеттеру и к моей функции setOpenNodes(). Конечно, dataProvider устанавливается перед вызовом setOpenNodes(), и это HierarchicalData. Но когда setOpenNodes() отладчик говорит, что dataProvider является нулевым ArrayCollection. Кажется, что это коренная проблема.
1 ответ
Мне нужно было вызвать commitProperties, прежде чем пытаться получить доступ к свойству 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();
}