Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   DataGrid - выделение элемента (http://www.flasher.ru/forum/showthread.php?t=102001)

sangle 07.10.2007 04:00

DataGrid - выделение элемента
 
У меня возник вопрос. Есть небольшой участок кода

Код:

    ...
    public var ac: ArrayCollection;
    ....
    dataGrid.dataProvider = ac;
    ....
    var cur: IViewCursor = ac.createCursor();
    if(cur.findAny({product_id: product_id}))
        dataGrid.selectedItem = cur.current;
    if(dataGrid.selectedItem == null)
        Alert.show('null !!!!!');

И... Alert.show('null !!!!!') отрабатывает. Может мне кто-то подсказать, почему так? Строка, найденная с помощью findAny, выделяется в DataGrid'е, но при этом selectedItem возвращает null.

sangle 07.10.2007 04:38

Странно, но замена
Код:

dataGrid.selectedItem = cur.current;
на
Код:

dataGrid.selectedIndex = ac.getItemIndex(cur.current);
помогла.
Я чето-то не понимаю, или есть разница между использованием свойств DataGrid'а: selectedIndex и selectedItem?

etc 07.10.2007 10:40

Речь о Flex или Flash CS3?
И что такое cur.current?
И что такое «ac»?
Почему нельзя давать более информативные названия объектам, переменным и т.п.?

sangle 08.10.2007 00:53

Речь идёт о Flex'е.
ac - это коллекция (ArrayCollection).
cur - это указатель, реализующий интерфейс IViewCursor, на коллекцию, который создаётся методом createCursor();
current - это свойство, указывающее на текущий элемент коллекции.
Перепишу так:
Код:

    ...
    public var ac: ArrayCollection;
    ....
    dataGrid.dataProvider = ac;
    ...
    var cur: IViewCursor = ac.createCursor();
    if(cur.findAny({product_id: product_id}))
        dataGrid.selectedItem = cur.current;
    if(dataGrid.selectedItem == null)
        Alert.show('null !!!!!');

В вопросе подправил тоже.

etc 08.10.2007 01:29

У ArrayCollection нет метода createCursor.

sangle 08.10.2007 14:30

to __etc
Ну да :). Интересно, как тогда работать с коллекциями?
Это основной и единственный (при котором коллекцию не нужно "вручную" уведомлять об изменениях) коректный способ работы с коллекциями, если используется сортировка и фильтрация данных...
ArrayCollecton наследуется от класса ListCollectionView, а в нём определём метод createCursor():

Код:

createCursor () method 

public function createCursor():IViewCursor
Creates a new IViewCursor that works with this view.

Returns  IViewCursor — A new IViewCursor implementation.

http://livedocs.adobe.com/flex/2/lan...ollection.html

etc 08.10.2007 14:42

Хм, вроде смотрел в inherited. Значит у меня билдер либо старый, либо врет =)
А можно весь код? Я не особый спец по флекс, тут без меня есть кому ответить. Но моделировать ситуацию с нуля лень, так что готовый код лучше)

sangle 08.10.2007 16:30

to __etc
Приведу код функции с добавленными комментариями для Вас
Код:

public function ChooseProduct(xml: XML): void {
    treeCategories.selectedItem = xml; // в контексте нашего вопроса не важно
    treeCategories.dispatchEvent(new Event(Event.CHANGE));
   
    // запоминаем текущую сортировку коллекции, потому что её пользуются многие другие компоненты
    var curSort: Sort = acProducts.sort;

    //создаём новую сортировку
    var sort: Sort = new Sort();

    // определяем поля сортировки, в нашем случае одно
    sort.fields = [new SortField('product_id', false, false, true)];
    acProducts.disableAutoUpdate();

    // меняем сортировку коллекции на новую
    acProducts.sort = sort;

    // обновляем коллекцию, потому что при измненении фильтрации и сортировки нужно вызывать refresh()
    acProducts.refresh();

    //создаём указатель на коллекцию
    var cur: IViewCursor = acProducts.createCursor();

    //поскольку коллекция отсортирована по product_id, то можно использовать такое свойство объекта для поиска
    if(cur.findAny({product_id: dgMatches.selectedItem.product_id})) {
 
        //если findAny вернул true, значит найден элемент в коллекции с нужным нам product_id
        //dgProductsByCategory.selectedItem = cur.current; не работает, вернее не даёт результата
        //поэтому вместо использования selecteItem приходится использовать selectedIndex,
        //предварительно найдя индекс текущего элемента, хотя разницы не должно быть
        dgProductsByCategory.selectedIndex = acProducts.getItemIndex(cur.current);
        dgProductsByCategory.setFocus();
    }
    //возвращаем предыдущую сортировку, которой пользовался какой-то компонент до вызова текущей функции
    acProducts.sort = curSort;
    acProducts.refresh();
    acProducts.enableAutoUpdate();
    treeCategories.dispatchEvent(new Event(Event.CHANGE));
}

где acProducts: ArrayCollection;
dgProductsByCategory: DataGrid;

sangle 08.10.2007 17:18

Думаю, тему можно закрывать, потому что кое-какие мысли возникли.
Я забыл, что метод insert() для IViewCursor'а вставляет элемент перед текущим, не перемещая курсор. Поэтому свойство current возращает не вновь созданный элемент.


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

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