Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Изменение цвета ряда DataGrid в зависимости от значения датапровайдера (http://www.flasher.ru/forum/showthread.php?t=91531)

__i 09.02.2007 17:57

шаманство айтем рендеров это особый раздел флекса..., вобщем в глубине всего этого конкретный экземпляр айтем рендера ни как особо не связан с конкретным элементом (далее "элемент") в дата провайдере. Вернее его связывает свойство айтем рендера(далее "айтем рендер" ))) ) "data" (ну или типа того). Но эта связь очень легко рвущаяся и заменяемая :

В жизни листовые компонеты создают количество айтем рендеров которое помещаеться в видимую область + 1-2 чтобы сделать иллюзию непрерывной прокрутки (ну или если количество элементов помещаеться в сам компонет, то количество айтем рендеров равно ему скролл не отображается). Теперь при прокрутке происходит этакая "карусель", когда айтем рендер скрывается вверху(внизу) то его просто перекидывают вниз (вверх) и меняют ему поле data. Выглядит это гдето так:

1
2 <- первый видимый
3
4
5
6 <- последний видимый

после скрола(проскролили на 2 пункта) получаеться:
5
6 <- первый видимый
1
2
3
4 <- последний видимый

Вполне вероятно (в твоем случае), создав 10 атем рендеров, при уменьшении размера листа, лист просто не ремувит лишние атем рендеры, а держит их "прозапас" (утверждать не буду, но как вариант, вполне вероятно это глупость я сказал).

Но все в конце концов сводиться к следующему при перестройке листа, лист просто выстраивает свои айтем рендеры как нужно и присваивает им соответствующие положению данные data. Тут вполне вероятно просиходит следующия ситуация. При этом присваивании айтем рендер просто думает что ему "досталась" старые данные и ничего не делает. Инвалидейты/валидейты ему пофигу (он выровнял себя как нужно, покрасил станлартные вещи и забил на остальное). Поэтому тебе нужно переопределить несколько методов у твоего айтем рендера, какие конкретно я тебе не скажу, но вполне вероятно это метод получения данных (setData вроде или data его тебе 100% нужно переопределить) вполне вероятно тот метод который "слушает" изменения внутри элемента(данных) , ну и какие-то методы которые отвечают за отрисовку твоего айтем рендера (скорей всего это будет тотже validate*|invalidate* и в нем ты просто будешь задавать соответствующий стиль ).

Ну и пару слов про секс.
Все кастомные айтем рендеры которые приведены в примерах в виде мхмл это ОТСТОЙ. Они только для красоты и ничего более. Какой-то более менние продвинутый функционал на них построить довольно сложно

Усе типа рассказал, когда выросту может даже напишу умную статью ).

__i 09.02.2007 18:06

Цитата:

Сообщение от __i
[вырезано много лишних слов из прошлой статьи]

В кратце Нирт дал те самое правильное решение, вернее ссылку на него :D
( http://flasher.ru/forum/showpost.php...98&postcount=5 ) ну разве что нужно убрать апдейтдисплей лист! т.к. они зачем-то все время перерисовывают замечательный айтем. Его нужно заменить на что то более оптимальное

Nirth 09.02.2007 18:47

__i прав, тебе нужно переопределять itemRenderer.

7thsky™ 10.02.2007 02:24

Согласен, и айтем рендер должен реализовывать mx.controls.listClasses.IDropInListItemRenderer
тогда будет у элемента {get | set} listData ():BaseListData, где в BaseListData есть и rowIndex и columnIndex

собственно Nirth дал самое оптимальное решение

Nirth 10.02.2007 03:24

А вроде каждый второй компонент (Label\CheckBox и тд) реализуют IDropInLitItemRenderer.

7thsky™ 10.02.2007 10:16

Сanvas не реализует например

baron27 14.02.2007 13:04

нормальное решение:
http://www.mikenimer.com/index.cfm/2...Grid-component

OlenKa 15.02.2007 15:30

У меня возник вопрос, а как можно поменять цвет строки уже во время работы? например после какого-то действия пользователя?

baron27 16.02.2007 10:50

Цитата:

Сообщение от OlenKa
У меня возник вопрос, а как можно поменять цвет строки уже во время работы? например после какого-то действия пользователя?

В данном случае - только, если на действия пользователя изменять соответствующим образом датапровайдер.

max_oil 21.04.2008 11:53

Цитата:

Сообщение от baron27 (Сообщение 612526)
Но вот в чем затык: например, датапровайдера хватает на 10 рядов и 10 ряд у нас красный, а теперь, если датапровайдер изменяется до 5 элементов, то эти пять элементов перекрашиваются правильно, а старый 10 ряд так и остается красным. Пробовал всякие там invalidate'ы - не помогает.

У меня похожая проблема, сначала все отоброжается нормально, но потом когда я меняю датапровайдер, цвета отображаются старые..
пробовал переопределять listData, как советовал 7thsky™, таким способом - не помогает.
Код:

    private var _listData:BaseListData;
   
    [Bindable("dataChange")]

    public function get listData():BaseListData
    {
      return _listData;
    }
   
    public function set listData(value:BaseListData):void
    {
      _listData = value;
    }

Во Флексе я новичок, наверно что-то не то вобще делаю.. Подскажите пожалуйста, что делать надо?


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

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