DataGrid: CheckBox в itemRenderer - нажимаю на один, выделяется другой

12 views
Skip to first unread message

y shumovskij

unread,
Jul 29, 2010, 2:17:00 PM7/29/10
to ruF...@googlegroups.com
Привет,

Юзаю Flex3.4

Для одного из столбцов DataGrid нужен чэк бокс. Делаю класс extend от CheckBox и прописываю в DataGridColumn.itemRenderer этот класс.
Запускаю, показываютсья мои чэк боксы, НО когда нажимаю выделяется не тот по которому нажал, а чисто какой-то случайный. Когда далее нажимаю, выделяеться ниже на ячейку за случайным и так по кругу....

Что за бред? как лечиться? кто сталкивался....?

y shumovskij

unread,
Jul 29, 2010, 2:34:26 PM7/29/10
to ruF...@googlegroups.com
Даже, заметил, иногда, несколько итемов сразу выделяются

Alexander Negoda

unread,
Jul 29, 2010, 2:43:29 PM7/29/10
to ruf...@googlegroups.com
Такое бывает, если item-ы одинаковые.
У меня разок один и тот же товар встречался дважды из выборки базы. Такое было.

y shumovskij

unread,
Jul 29, 2010, 4:26:23 PM7/29/10
to ruf...@googlegroups.com
Что значит одинаковые...?

29 июля 2010 г. 21:43 пользователь Alexander Negoda <alexande...@gmail.com> написал:

Evgeny Rybakov

unread,
Jul 29, 2010, 4:45:36 PM7/29/10
to ruf...@googlegroups.com
есть поле uid у объекта ? :)

29 июля 2010 г. 23:26 пользователь y shumovskij <yurij.sh...@gmail.com> написал:

Jloa

unread,
Jul 29, 2010, 5:39:13 PM7/29/10
to ruFlex
Быть не может. У каждого UIComponent (а CheckBox как рез его дитя),
есть uid свойство, которое в потрохах генерит этот самый uid при
помощи UIDUtil.
Попробуйте создать ItemRenderer наследуясь от HBox, скажем и в нем
создать CheckBox, по клику на который вы будет уже сами руками вещать
событие выше т.е. в DataGrid.

зы: а можно код потыкать?

y shumovskij

unread,
Jul 29, 2010, 5:44:14 PM7/29/10
to ruf...@googlegroups.com
засыпаю, завтра скину код

Андрей Скорик

unread,
Jul 29, 2010, 6:39:20 PM7/29/10
to ruf...@googlegroups.com
Может такое быть.. это такая багофича :)) в листе не должно быть
одинаковых ("неуникальных") элементов у каждого элемента должен быть
уникальный идентификатор...

<mx:List dataProvider="{['topic1', 'topic2', 'topic2', 'topic3']}" />

Надо из строк сделать объекты типа {label:'topic1', data:12}

--
С уважением, Скорик Андрей. andrew...@gmail.com

Андрей Скорик

unread,
Jul 29, 2010, 6:39:53 PM7/29/10
to ruf...@googlegroups.com
об этом писалось в Jira - поищите

Андрей Скорик

unread,
Jul 29, 2010, 6:40:29 PM7/29/10
to ruf...@googlegroups.com
а чекбокс тут не при делах :) лист виноват

Андрей Скорик

unread,
Jul 29, 2010, 6:42:03 PM7/29/10
to ruf...@googlegroups.com
> лист виноват

Грид - это тоже лист

Alexander Negoda

unread,
Jul 29, 2010, 10:56:48 PM7/29/10
to ruf...@googlegroups.com
Сталкивался с таким не раз. Если, к примеру, метод сервера отдаёт
список и в этом списке повторяются объекты, то наблюдаются именно те
симптомы, что описал автор.
Я не знаю механизма этого явления во флексе. И не пытался повторить
такое без сервера. Но мне кажется, что дело в одинаковым наборе полей
объекта.
Насколько я понимаю, uid не может повторяться в принципе - это
уникальное значение.
И ещё.
В моём случае, сервер отдавал типизированные объекты. Я не смотрел их
uid-ы. Но если, например, один и от же товар (то есть одинаковые
наборы полей) присутствует в списке, то флекс воспринимает их как
один.

Станислав Айтуганов

unread,
Jul 30, 2010, 5:26:53 AM7/30/10
to ruFlex
Классика работы с ItemRenderer
public set data(value:Object):void ; - переопределяете?
Станислав

Станислав Айтуганов

unread,
Jul 30, 2010, 5:35:45 AM7/30/10
to ruFlex
Согласен с Jloa
Сделайте Hbox с CheckBox внутри, создайте свойство checked, меняйте
его по клику и забайндите(или сетайте вручную) на свойство selected
CheckBox-a

y shumovskij

unread,
Jul 30, 2010, 5:46:11 AM7/30/10
to ruf...@googlegroups.com
Сделал локальный пример http://shumovsky.com/files/DataGrid_CheckBox_bug.rar:

1. Айтемы не одинаковые (ID разные)
2. с ovveride data и без него.. ничего не меняет в моем случае
3. HBox не лечит..... (

y shumovskij

unread,
Jul 30, 2010, 5:49:20 AM7/30/10
to ruf...@googlegroups.com
В примере к примеру снимаешь выделение у первого, а делается это для 1го и в конце для нескольких....

30 июля 2010 г. 12:46 пользователь y shumovskij <yurij.sh...@gmail.com> написал:

y shumovskij

unread,
Jul 30, 2010, 5:59:52 AM7/30/10
to ruf...@googlegroups.com
И еще заметил, на том же примере что и выслал при меньшем количестве айтемов такого не повторяется...

Олег Галабурда

unread,
Jul 30, 2010, 6:09:45 AM7/30/10
to ruf...@googlegroups.com
Здрасте!

Согласен со Станиславом, это классика. :)
Айтем рендереры используются по нескольку раз для разных Data объектов
и вы должны сами следить, чтоб данные правильно обновлялись.
А так у вас беспризорный ключ который мигрирует между появлениями
одного айтем рендерера с разными дата объектами(элементами вашего
эррей коллекшона).
Подвяжите состояния чекбокса к чему-нибудь материальному, к вашему VO
объекту и всё станет на свои места.

> И еще заметил, на том же примере что и выслал при меньшем количестве айтемов
> такого не повторяется...

--
Oleg Galaburda
http://blog.actualwave.com/
http://jsinterface.googlecode.com/
http://guibuilder.org/

y shumovskij

unread,
Jul 30, 2010, 6:15:12 AM7/30/10
to ruf...@googlegroups.com
Можно чуть по-прикладней объяснить... ?

30 июля 2010 г. 13:09 пользователь Олег Галабурда <bur...@gmail.com> написал:

Олег Галабурда

unread,
Jul 30, 2010, 6:22:21 AM7/30/10
to ruf...@googlegroups.com
> Можно чуть по-прикладней объяснить... ?
Да, вот ваш пример.
http://groups.google.com/group/ruflex/web/Flex3ItemRendererCheckboxLinking.zip
Списки во Flex(все, если я не ошибаюсь) кешируют айтемрендереры, т.е.
не создают больше чем можно отобразить за раз. А когда пользователь
скроллит список, то айтемрендедреры ставшие невидимыми просто
перемешаются в то место где должны появиться новые и им отдаются новые
данные для отображения. Получается что айтемрендерер при получении
новых данных должен освежится как-будто ничего и не было. А у вас в
айтемрендерере не контролируемый переключатель в виде чекбокса и
обновление его значения полностью ложится на плечи разработчика.

Олег Галабурда

unread,
Jul 30, 2010, 6:26:32 AM7/30/10
to ruf...@googlegroups.com
>> Можно чуть по-прикладней объяснить... ?
> Да, вот ваш пример.
Меня группа не пустила к моему же файлу, поэтому кинул ещё сюда
http://rapidshare.com/files/409972032/Flex3ItemRendererCheckboxLinking.zip

В примере изменён был айтемрендерер и была добавлена обёртка для VO в
виде класса ItemRendererState, который как раз и сохраняет состояние
чекбокса.

y shumovskij

unread,
Jul 30, 2010, 6:48:20 AM7/30/10
to ruf...@googlegroups.com
Спасиб, работает!

Разбираюсь

y shumovskij

unread,
Jul 30, 2010, 7:36:54 AM7/30/10
to ruf...@googlegroups.com
Олег, Станислав.... магия :)

kuril

unread,
Jul 30, 2010, 7:47:24 AM7/30/10
to ruFlex

> Списки во Flex(все, если я не ошибаюсь) кешируют айтемрендереры, т.е.
> не создают больше чем можно отобразить за раз. А когда пользователь
> скроллит список, то айтемрендедреры ставшие невидимыми просто
> перемешаются в то место где должны появиться новые и им отдаются новые
> данные для отображения.

Во Flex 3 списки именно так и поступают. В spark компонентах Flex 4
рендереры создает DataGroup, но сколько их нужно, определяет layout и
если выставить useVirtualLayout=false, то рендереры реюзаться не
будут, и для каждого айтема будет создан персональный рендерер.

Reply all
Reply to author
Forward
0 new messages