Просмотр полной версии : 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.
Странно, но замена
dataGrid.selectedItem = cur.current;
на
dataGrid.selectedIndex = ac.getItemIndex(cur.current);
помогла.
Я чето-то не понимаю, или есть разница между использованием свойств DataGrid'а: selectedIndex и selectedItem?
Речь о Flex или Flash CS3?
И что такое cur.current?
И что такое «ac»?
Почему нельзя давать более информативные названия объектам, переменным и т.п.?
Речь идёт о 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 !!!!!');
В вопросе подправил тоже.
У ArrayCollection нет метода createCursor.
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/langref/mx/collections/ArrayCollection.html
Хм, вроде смотрел в inherited. Значит у меня билдер либо старый, либо врет =)
А можно весь код? Я не особый спец по флекс, тут без меня есть кому ответить. Но моделировать ситуацию с нуля лень, так что готовый код лучше)
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;
Думаю, тему можно закрывать, потому что кое-какие мысли возникли.
Я забыл, что метод insert() для IViewCursor'а вставляет элемент перед текущим, не перемещая курсор. Поэтому свойство current возращает не вновь созданный элемент.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.