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

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

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

Регистрация: Sep 2007
Сообщений: 32
Flame 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; 08.10.2007 в 00:56.
Старый 07.10.2007, 04:38
sangle вне форума Посмотреть профиль Отправить личное сообщение для sangle Найти все сообщения от sangle
  № 2  
Ответить с цитированием
sangle

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

Старый 07.10.2007, 10:40
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Речь о Flex или Flash CS3?
И что такое cur.current?
И что такое «ac»?
Почему нельзя давать более информативные названия объектам, переменным и т.п.?

Старый 08.10.2007, 00:53
sangle вне форума Посмотреть профиль Отправить личное сообщение для sangle Найти все сообщения от sangle
  № 4  
Ответить с цитированием
sangle

Регистрация: Sep 2007
Сообщений: 32
Речь идёт о 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 !!!!!');
В вопросе подправил тоже.


Последний раз редактировалось sangle; 08.10.2007 в 01:02.
Старый 08.10.2007, 01:29
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
У ArrayCollection нет метода createCursor.

Старый 08.10.2007, 14:30
sangle вне форума Посмотреть профиль Отправить личное сообщение для sangle Найти все сообщения от sangle
  № 6  
Ответить с цитированием
sangle

Регистрация: Sep 2007
Сообщений: 32
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


Последний раз редактировалось sangle; 08.10.2007 в 16:15.
Старый 08.10.2007, 14:42
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 08.10.2007, 16:30
sangle вне форума Посмотреть профиль Отправить личное сообщение для sangle Найти все сообщения от sangle
  № 8  
Ответить с цитированием
sangle

Регистрация: Sep 2007
Сообщений: 32
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 в 16:37.
Старый 08.10.2007, 17:18
sangle вне форума Посмотреть профиль Отправить личное сообщение для sangle Найти все сообщения от sangle
  № 9  
Ответить с цитированием
sangle

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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