PDA

Просмотр полной версии : DataGrid - выделение элемента


sangle
07.10.2007, 04:00
У меня возник вопрос. Есть небольшой участок кода


...
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/langref/mx/collections/ArrayCollection.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 возращает не вновь созданный элемент.