Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Перетаскивание элементов внутри Tree - как выяснить, что куда перетащили? (http://www.flasher.ru/forum/showthread.php?t=130802)

Gaen 06.10.2009 00:54

Перетаскивание элементов внутри Tree - как выяснить, что куда перетащили?
 
Компонент Tree позволяет перетаскивать элементы между папками, при этом элементы перемещаются туда, куда их перетащили. Как узнать, какой элемент куда перетащили? Это нужно для того, чтобы отправить на сервер запрос о перемещении элемента из одной категории в другую.

wvxvw 06.10.2009 01:59

Не пробуя, на угад:
подписаться на dragComplete / paste, у евента dragSource будет по идее перетаскиваемым объектом... И потом через getParentItem() отыскать куда он упал. Вопрос в том, что именно вы подразумеваете под "куда перетащили", вполне возможно, что будет менее затратно просто сравнить XML (если провайдер XML) до и после.

Gaen 06.10.2009 04:49

После долгого вдумчивого чтения кода Tree пришёл к вот такому решению:
Код AS3:

this.structureTree.calculateDropIndex(e);
 
var dd        :Object        =        this.structureTree.mx_internal::_dropData;
 
if(dd.parent)trace(dd.parent.@title); else trace('root');

У этого компонента есть очень полезная функция updateDropData, которая вычисляет и буквально приносит на блюдечке много чего полезного, в том числе ссылку на текущий родительский элемент. Правда блюдечко это находится в пространстве mx_internal, а сама функция приватная :) Но зато есть функция calculateDropIndex, которая фактически её и вызывает. Теперь всё в ажуре: сравниваем parent до и после перетаскивания и делаем что хотим.

Добавлено через 1 час 14 минут
И только потом наткнулся на метод getParentItem.

Пойду-ка я спать лучше.

WhiteWoolf 14.10.2009 19:30

Господа, боюсь, что я присоединяюсь к вопросу, и никак не могу удовлетвориться ответом. Если можно, чуть-чуть подробнее.
Конкретно, задача очень простая. Есть dataprovider (XMLList):
Код AS3:

        <mx:XMLList id="treeData">
            <node szName="Mail Box" szIndex="1">
                <node szName="Inbox"  szIndex="2">
                    <node szName="Marketing" szIndex="3"/>
                    <node szName="Product Management" szIndex="4"/>
                    <node szName="Personal" szIndex="5"/>
                </node>
                <node szName="Outbox" szIndex="6">
                    <node szName="Professional" szIndex="7"/>
                    <node szName="Personal" szIndex="8"/>
                </node>
                <node szName="Spam" szIndex="9"/>
                <node szName="Sent" szIndex="10"/>
                </node>       
    </mx:XMLList>

Он подцеплен к дереву, и поле szName выводится в качестве labelField. Т.е. как-то так:
Код AS3:

<mx:Tree id="theTreeCtrl" labelField="@szName" showRoot="false"
 dataProvider="{treeData}" dragEnabled="true" dropEnabled="true"
dragDrop="handlerDragDrop(event)"/>

(Код на ходу упрощал, так что если есть мелкие нестыковки - извиняйте ...)
Инициированный Drag and Drop великолепно работает. Но при окончательной обработке требуется провести ряд действий с атрибутами szIndex из соответсвующих элементов дерева. Я легко достаю этот атрибут из элемента КОТОРЫЙ перетаскивается. Выглядит это примерно так:
Код AS3:

                protected function handlerDragDrop(theEvent:DragEvent):void{
                        var myData:Array = theEvent.dragSource.dataForFormat("treeItems") as Array;
                        var szIndexSource:String = myData[0].@szIndex;
 
                        return;
                }

А как добраться до этого же значения элемента, на который его бросили? Т.е. Я определяю номер его строки на экране (с учетом открытых и схлопнутых веток)
Код AS3:

var nLine:int = theTreeCtrl.calculateDropIndex(theEvent);

А чего с ним делать дальше? Как добраться до DataProvider-а, а точнее до нужного элемента в нем?

Заранее, спасибо.

Добавлено через 15 часов 44 минуты
Если кому еще интересна эта тема, я все таки разобрался. Полученный через calculateDropIndex индекс следует присвоить в selectedIndex и тогда из selectedItem можно будет извлекать необходимые значения.
Побочный эффект данного решения в том, что смещается выделение в дереве и не совсем понятно поведение при множественном выделении. Однако как базовое решение - вполне пригодно.
Итого: для работы с данными элемента на который брошен перетаскиваемый элемент следует писать:
Код AS3:

                        var nLine:int = theTreeCtrl.calculateDropIndex(theEvent);
                        theTreeCtrl.selectedIndex = nLine;
                        var szIndexDestinct:String = theTreeCtrl.selectedItem.@szIndex;



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

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