Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.02.2009, 19:04
mitado вне форума Посмотреть профиль Отправить личное сообщение для mitado Найти все сообщения от mitado
  № 1  
Ответить с цитированием
mitado

Регистрация: Dec 2007
Сообщений: 52
По умолчанию управление структурой данных для 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

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


Последний раз редактировалось mitado; 06.02.2009 в 19:06.
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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