Форум 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)

baron27 01.02.2007 21:13

Изменение цвета ряда DataGrid в зависимости от значения датапровайдера
 
Привет!
Каким образом можно прорисовывать цвет ряда в датагриде в зависимости от значения, полученного из датапровайдера?

Nirth 01.02.2007 21:47

http://flasher.ru/forum/showpost.php...98&postcount=5

не подойдет?

Nirth 01.02.2007 22:30

Вообще не совсем понятно.

Дело в том что дата провайдер содержит в себе объекты, которые передаются ячейкам, тоесть дата провайдер не содержит в себе информации для самой колонки.

Есть два способа, либо реализовать возможность смены цвета у каждой ячейки в отдельности (тогда нужно передавать, каждой ячейке цвет), либо вывести цвета в отдельное свойство.

Есть вариант через задницу, это задавать цвет скажем только первому эллементу в колонке, и остальные ячейки берут значение первого эллемента.

Вот например если юзать отдельное свойство colors

Код:

package controls
{
        import mx.controls.DataGrid;
        import mx.core.ClassFactory;
        import mx.collections.ArrayCollection;
        import mx.controls.dataGridClasses.DataGridColumn;

        public class ColoredDataGrid extends DataGrid
        {
                private var _colors:Array;
               
                public function ColoredDataGrid()
                {
                        super();
                       
                        itemRenderer = new ClassFactory(ItemRenderer);
                }
                [Bindable]
                [Inspectable]
                public function set colors(value:Object):void
                {
                        if(value is ArrayCollection)
                        {
                                _colors = (value as ArrayCollection).source;
                        }
                        else if(value is Array)
                        {
                                _colors = value as Array;
                        }
                       
                        for (var i:Number = 0; i < _colors.length; i++)
                        {
                                if(columns[i] != null)
                                {
                                        (columns[i] as DataGridColumn).setStyle("backgroundColor", _colors[i]);
                                }
                        }
                }
                public function get colors():Object
                {
                        return _colors
                }
        }
}
        import mx.controls.Label;
        import controls.ColoredDataGrid;
        import mx.controls.dataGridClasses.DataGridListData;
       

class ItemRenderer extends Label
{
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
                super.updateDisplayList(unscaledWidth, unscaledHeight);
               
                var ld:DataGridListData = listData as DataGridListData;
                var dg:ColoredDataGrid  = ld.owner as ColoredDataGrid;
               
                trace(ld.rowIndex);
                trace(this.text);
                trace("");
               
                /*if(ld.rowIndex > 0 && dg.colors != null && dg.colors[ld.columnIndex] != null)
                {
                        graphics.beginFill(dg.colors[ld.columnIndex]);
                        graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);
                        graphics.endFill();
                }*/       
        }
}


baron27 02.02.2007 00:30

Цитата:

Сообщение от Nirth

спасибо. Видел. Наверное придется использовать это.

Кстати, по поводу
>> Вот например если юзать отдельное свойство colors

Цвет надо передавать в датапровайдере? Я не совсем понял. Можешь привести примерчик...

Nirth 02.02.2007 01:15

В моем случае я цвет подаю через свойство colors

Код:

<myNamespace:ColoredDataGrid colors="{[0xF2F2F2, 0xFF6600]}"......
можно и через дата провайдер, скажем сохранять цвета в нулевой позиции, и потом сносить ее(нулевую позицию), чтобы она не рендерилась.

baron27 02.02.2007 02:12

Ага, ясно, спасибо!
Блин, нафига убрали только
dg.setPropertiesAt(2, {backgroundColor:0xFF0000})...

baron27 02.02.2007 13:01

использовал вариант http://flasher.ru/forum/showpost.php...98&postcount=5

При использовании ColoredDataGrid все почему-то тормозит.

baron27 09.02.2007 16:09

Переделал немного примере Питера Энта по отрисовке фонов рядов в гриде:

Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml">
        <mx:Script>
                <![CDATA[
                import mx.collections.ArrayCollection;
               
                public var keyCell:String;
               
                        override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number,
                                                  color:uint, dataIndex:int):void
                  {
                   
                          if (dataIndex > (dataProvider as ArrayCollection).length-1) {
                                  return;       
                          }
                          var item:Object = (dataProvider as ArrayCollection).getItemAt(dataIndex);
                       
                        if( item[keyCell] == 0 ) {
                                color = 0xf97a86;
                        }
                        else  {
                                color = 0xFFFFFF;
                        }
                    super.drawRowBackground(s,rowIndex,y,height,color,dataIndex);
                    }

                   
                ]]>
        </mx:Script>
</mx:DataGrid>

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

Nirth 09.02.2007 17:20

у меня сейчас времени мало, можешь демонстрацию сделать?

baron27 09.02.2007 17:35

http://gorbatov.org/tests/coloredDG/


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

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