Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   управление структурой данных для AdvancedDataGrid / Tree (http://www.flasher.ru/forum/showthread.php?t=121074)

mitado 06.02.2009 19:04

управление структурой данных для AdvancedDataGrid / Tree
 
Недавно столкнулся с задачей - необходимо было отобразить сложную структуру данных в 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

Если кто-то знает другие, возможно более простые способы управления логикой дерева, отпишитесь :)


Часовой пояс GMT +4, время: 18:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.