Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Как обойти дерево, используя HierarchicalCollectionViewCursor? (http://www.flasher.ru/forum/showthread.php?t=159195)

kro_kro 28.06.2011 14:35

Как обойти дерево, используя HierarchicalCollectionViewCursor?
 
Пытаюсь обойти все элементы дерева на всех уровнях иерархии. Вот код:
Код AS3:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                                width="500" height="500"
                                creationComplete="onCreationComplete(event)">
        <mx:Script>
                <![CDATA[
                        import mx.collections.ArrayCollection;
                        import mx.collections.HierarchicalCollectionView;
                        import mx.collections.HierarchicalCollectionViewCursor;
                        import mx.collections.HierarchicalData;
                        import mx.collections.IHierarchicalCollectionViewCursor;
                        import mx.controls.List;
                        import mx.events.FlexEvent;
                        [Bindable]
                        private var treeDP:HierarchicalCollectionView;
                        private var treeData:Array=[{label:"leaf 1"}];
 
                        protected function onCreationComplete(event:FlexEvent):void
                        {
                                var children:Array=[{label:"leaf 11"},{label:"leaf 12"}];
                                treeData[0].children=children;
                                treeDP=new HierarchicalCollectionView(new HierarchicalData(treeData));
                        }
 
 
                        protected function onClick(event:MouseEvent):void
                        {
                                var cursor:IHierarchicalCollectionViewCursor;
                                cursor=IHierarchicalCollectionViewCursor(treeDP.createCursor());
                                while(cursor.current)
                                {
                                        trace(cursor.current.label);
                                        cursor.moveNext();
                                }
                        }
 
                ]]>
        </mx:Script>
        <mx:VBox width="100%" height="100%">
                <mx:Tree id="tree" dataProvider="{treeDP}" width="100%" height="100%"/>
                <!--<mx:AdvancedDataGrid id="grid" dataProvider="{treeDP}" width="100%" height="100%"/>-->
                <mx:Button click="onClick(event)"/>
        </mx:VBox>
</mx:Application>

Увы, что при открытом, что при закрытом корневом узле, в консоль трейсится только "leaf 1", т.е. курсор не обходит данные в глубину. Для AdvancedDataGrid этот код работает. Подскажите, как сделать, чтоб он работал и для дерева?

alatar 28.06.2011 18:04

Tree не умеет нормально работать с HierarchicalCollectionView. Для "разворачивания" / "сворачивания" дерева он использует интерфейс ITreeDataDescriptor

Цитата:

Пытаюсь обойти все элементы дерева на всех уровнях иерархии
Я, в таком случае, использовал рекурсию.

kro_kro 28.06.2011 18:12

Спасибо. Похоже, рекурсия -- оптимальный вариант.

saprahan 30.06.2011 18:45

Цитата:

Сообщение от kro_kro (Сообщение 1007110)
Спасибо. Похоже, рекурсия -- оптимальный вариант.

Смотря какого размера дерево

alatar 30.06.2011 19:05

saprahan, вы полагаете, что курсор это делает каким-то магическим способом и будет работать быстрее?
Цитата:

Смотря какого размера дерево
Большие объемы данных тянуть на клиент смысла нет.

saprahan 01.07.2011 12:09

Цитата:

Сообщение от alatar (Сообщение 1007781)
saprahan, вы полагаете, что курсор это делает каким-то магическим способом и будет работать быстрее?

Большие объемы данных тянуть на клиент смысла нет.

Это так, но динамическая подгрузка стоит дорого. При коммерческой разработке ресурсы ограничены.

Добавлено через 10 минут
Есть дешевое промежуточное решение. Оно конечно не поможет автору темы, но очень здорово помогает справиться с большинством вопросов. Это две мапы uid->parent и uid->item, которые нужно создавать при смене сорса HCV. В самом HCV разумеется.


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

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