Недавно столкнулся с задачей - необходимо было отобразить сложную структуру данных в AdvancedDataGrid, но с определенной логикой дерева.
По умолчанию ADG отображает все ноды как папки, а их содержимое как строки, что не всегда устраивает.
На данный момент я нашел два метода управления структуры дерева в ADG:
1. использовать свойство HierarchicalData.childrenField
Цитата:
|
Indicates the field name to be used to detect children objects in a data item. By default, all subnodes are considered as children for XML data, and the children property is used for the Object data type. This is helpful in adapting to a data format that uses custom data fields to represent children.
|
Свойство полезно в случае, если можно под него изменить структуру данных. Если же требуется более продвинутый контроль над процессом, то лучше воспользоваться вторым методом
2. Создать подклас HierarchicalData - внутри него можно творить все что угодно с данными, обрабатываемыми ADG
Например, если из сложной XML структуры в дереве ADG необходимо показать только три уровня Проект-Здание-Блок, класс будет выглядеть примерно так:

Код AS3:
package
{
import mx.collections.HierarchicalData;
import mx.collections.XMLListCollection;;
public class MenuHierachicalData extends HierarchicalData
{
public function MenuHierachicalData()
{
super();
}
// getChildren возвращает все дочерние XML ноды для отображения в структуре дерева
// в нашем случае, проперяем, если текущий объект (нод) является проектом, то возвращаем дома,
//если текущий объект является домом - возвращаем блок,
//иначе ничего не возвращаем
override public function getChildren(node:Object):Object {
try {
if (node is XML) {
if (XML(node).name()=="building"){
if(XML(node).block is XMLListCollection){
return node.block;
} else {
return new XMLListCollection(node.block);
}
} else if (XML(node).name()=="project"){
if(XML(node).building is XMLListCollection){
return node.building;
} else {
return new XMLListCollection(node.building);
}
}
}
}
catch (e:Error) {
trace("[Descriptor] exception checking for getChildren");
}
return null;
}
// canHaveChildren отвечает за отображения иконки фолдера (true) или листа (false)
//(которые необязательно соответствуют фактическому наличию детей).
// в нашем случае только Проекты и Здания могут иметь детей
override public function canHaveChildren(node:Object):Boolean {
try {
if (XML(node).name() == "project" ||XML(node).name() == "building") {
return true;
}
}
catch (e:Error) {
trace("[Descriptor] exception checking for isBranch");
}
return false;
}
// hasChildren - отвечает за отображение стрелки
// стрелка отображается при фактическом наличии детей
override public function hasChildren(node:Object):Boolean {
if (node == null) return false;
var children:Object = getChildren(node);
try {
if (children.length > 0)
return true;
}
catch (e:Error) {
}
return false;
}
}
}
Остается токлько использовать этот объект в качестве ADG.dataProvider.
Аналогичную схему можно применить и к компонету Tree, для этого создаем аналогичный класс под свойством Tree.dataDescriptor
Если кто-то знает другие, возможно более простые способы управления логикой дерева, отпишитесь
