Порядок следования элементов в ADG
Доброго времени суток.
Имеется иерархическая структура(2х уровневая).
у парентов(1ый уровень) у ValueObject'ов есть поле order отвечающее за порядок отображения этих парентов(те перед установкой дата-провайдера колекция сортируется по этому полю).
Дальше необходимо в процессе работы менять порядок групп(перетаскивание или еще как).
столкнулся с проблемой. Есть следующий код
Код AS3:
//запоминаем индекс выделенного элемента
const selectedIndex:int = dataGrid.selectedIndex;
var cursor:IViewCursor = HierarchicalCollectionView(dataGrid.dataProvider).createCursor();
//бежим курсором до следующей первой группы(2)
cursor.seek(CursorBookmark.FIRST, selectedIndex + 1);
while (! (cursor.current.valueOf() is ClientProfileGroup))
Assert.isTrue(cursor.moveNext());
//удаляем ее(2) и запоминаем
var item:Object = cursor.remove();
//откатываемся на сохранненый индекс
cursor.seek(CursorBookmark.FIRST, selectedIndex);
//а группа ли это
Assert.isTrue(cursor.current.valueOf() is ClientProfileGroup);
//меняем order у групп
const order:uint = cursor.current.order;
cursor.current.order = item.order;
item.order = order;
//вставляем сохраненную группу(2)
cursor.insert(item);
данный код делает опускание группы.
те имея
1
+----childrens
2
+----childrens
3
+----childrens
4
+----childrens
опускаем группу например №3, получаем
1
+----childrens
2
+----childrens
4
+----childrens
3
+----childrens
код работает если все группы свернуты, если группа которая находится выше опускаемой развернута(те видны чилды) то код начинает работать странно - меняется порядок у групп которые находятся ниже опускаемой, причем у всех :) - каруселька получается.
Подскажите как решить проблему :wacko:3ий день не могу добиться нормального результата
Добавлено через 27 часов 44 минуты
не знаю на сколько правильно такое, решил проблему изменениями в модели
Код AS3:
//берем выделенную группу
var selectedItem:TreeItem = dataGrid.selectedItem as TreeItem;
//а группа ли это
Assert.notNull(selectedItem.valueOf() as ClientProfileGroup);
//Определяем индекс группы в массиве
const selItemIdx:int = model.data.getItemIndex(selectedItem);
//должен быть найден
Assert.isTrue(selItemIdx != -1);
//индекс группыд ля замены
const idx:int = selItemIdx + 1;
//метод не должен выполняться для последней группы
Assert.isTrue(idx < model.data.length);
//берем группу для замены
var item:TreeItem = model.data.getItemAt(idx) as TreeItem;
//группа ли это?
Assert.notNull(item);
//меняем группы местами в массиве
model.data.addItemAt(model.data.removeItemAt(selItemIdx), idx);
//меняем order у групп
const order:uint = selectedItem.order;
selectedItem.order = item.order;
item.order = order;
//отмечаем поднимаемую группу на сохранение
if (false == editedItems.contains(item))
editedItems.addItem(item);
dataGrid.selectedItem = selectedItem;
ЗЫ комменты пишу до того как пишу код, если кому интересно вдруг стало - не лень ли мне....
|