Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

“Раскрашиваем” cxGrid.

Тема заливки строк разными цветами, в зависимости от значения полей – весьма актуальна для любых гридов. Почему-то мне казалось, что я уже писал о том как это сделать в cxGrid, однако перелистав предыдущие статьи рубрики, я не нашел ничего подобного. Исправляюсь.

Итак, дано:

Поле ‘sales’ таблицы, к которой привязан cxGrid1DBTableView1 принимает значения 0 или 1. Необходимо строки, в которых значение sales равно 0 сделать серыми.

В данном случае определяем обработчик события OnCustomDrawCell. Код будет выглядеть примерно так:

ARec := AViewInfo.Bounds;
//i:=10;
i:=cxGrid1DBTableView1.GetColumnByFieldName(‘SALES’).Index;
if AViewInfo.GridRecord.Values[i] = 0 then
begin
ACanvas.Brush.Color:= clWindow;
ACanvas.Font.Color:= clCaptionText;
end
else
begin
ACanvas.Brush.Color:= clBtnFace;
ACanvas.Font.Color:= clCaptionText;
end;
ACanvas.FillRect(ARec);

ARec := AViewInfo.Bounds;

//i:=10;

i:=cxGrid1DBTableView1.GetColumnByFieldName(‘SALES’).Index;

if AViewInfo.GridRecord.Values[i] = 0 then

begin

ACanvas.Brush.Color:= clWindow;

ACanvas.Font.Color:= clCaptionText;

end

else

begin

ACanvas.Brush.Color:= clBtnFace;

ACanvas.Font.Color:= clCaptionText;

end;

ACanvas.FillRect(ARec);

Обратите внимание на то, что в представлении мы ищем в каком столбце грида у нас отображается поле Sales:

i:=cxGrid1DBTableView1.GetColumnByFieldName(‘SALES’).Index;

Конечно, мы могли бы просто задать номер этого столбца (например, i:=10;), но в этом случае, если пользователь поменяет в процессе работы столбцы местами, код перестанет работать.

Просто проверить значение поля Sales в DataSet, естественно, нельзя. При закраске грида перемещения по DataSet’у не производится, и поэтому всегда будет подставляться значение для текущей записи.

Если не произвести вызов ACanvas.FillRect(ARec);, то активная строка грида будет неверно прорисовываться.

Попутно можно рассмотреть задачу блокировки возможности редактирования в строках, в которых значение поля Sales не равно нулю.

procedure TfAddEdPos.cxGrid1DBTableView1Editing(Sender: TcxCustomGridTableView;

AItem: TcxCustomGridTableItem; var AAllow: Boolean);

var

i: integer;

begin

i:=cxGrid1DBTableView1.GetColumnByFieldName(‘SALES’).Index;

if AItem.FocusedCellViewInfo.GridRecord.Values[i] = 0 then

begin

AAllow:= True

end

else

AAllow:= False;

end;

Все происходит аналогичным образом, только обрабатывается событие OnEditing.

К слову, в свое время эту задачу я довольно ориганально решил для GridEh. Но это тема для отдельного поста.

Другие статьи серии:

DevExpress. TIPS & TRICKS #0
DevExpress. TIPS & TRICKS #1
DevExpress. TIPS & TRICKS #2
DevExpress. TIPS & TRICKS #3
DevExpress. TIPS & TRICKS #5
DevExpress. TIPS & TRICKS #5.5
DevExpress. TIPS & TRICKS #6
DevExpress. TIPS & TRICKS #7


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

10 комментариев: DevExpress. TIPS & TRICKS #4

  • у cxGrid1DBTableView1 есть событие Styles.OnGetContentStyles и в нём можно написать
    if (ARecord.Values[cxGrid1DBTableView1 .GetColumnByFieldName('SALES').Index] = 1) then
    AStyle := StyleName (типа TcxStyle)
    и всё

    • Можно и так. Скорее всего, с точки зрения логики компонента, так правильнее. Тут ключевой момент – как определить значение sales для конкретной строки.

  • Лучше всего для грида и трилиста пользоваться конструкциями вида
    AViewInfo.GridRecord.Values[grid_OrdersViewMainSUM.Index]

    Чтобы при изменении можно было всегда найти проблемные места и исправить их.

  • На самом деле можно сделать всё намного проще и удобнее.
    Берём компонент TcxStyleRepository, добавляем в него 2 стиля (например, cxStyle1 и cxStyle2), для чётной и нечётной строки и настраиваем их.

    в дизайнере выбираем cxGrid1DBTableView1, раскрываем в свойствах Styles и в качестве СontentEven и ContentOdd указываем cxStyle1 и cxStyle2 соответственно.

    P.S. если TcxStyleRepository глобально доступен для всех форм где есть гриды – то расскрашивать их становиться совсем просто и быстро.

    P.P.S. так же можно настроить и другие стили, коих там в изобилии

  • Согласен с автором выше.
    Чтоб раскрасить четные и нечетные строки проще использовать (СontentEven и ContentOdd), в больших проэктах обычно создаються глобальные страницы стилей (SheetStyles) для всех видов компонент, чтобы обеспечить одинаковый стиль.
    OnGetContentStyles обычно применяется дляподсветки какой нибуть нетипичной строки.
    На а OnCustomDrawCell, вообще для отрисовки на ячеках чегото своего.
    Для разработка важно время потраченое на разработку. Написание каждого обработчика, это время на разработку и нет смысла использовать OnGetContentStyles где достаточно использовать простое назаначение стилей и уж тем более нет смысла использовать OnCustomDrawCell назначение которого совсем иное.

  • Согласен с мнениями выше.

    От таких конструкций : ACanvas.FillRect(ARec) желательно отказаться в пользу задания стилей динамически,
    т.к. Вы наверняка захотите экспортировать свои сетки в Эксель или HTML, так вот при DecEx-экспорте цвета будут браться из стилий. И вы получите раскрашенные документы без лишних сток кода.

    • Аргумент. Не подумал я об этом.

      В документации есть оба примера (и с помощью стилей и с помощью ACanvas). Только в общем объеме оно утонуло, я нашел эти примеры в форуме поддержки :)

      В любом случае, спасибо.

  • здраствуйте помогите с dbgridom я выделяю несколько записей при помощи multiselectom но немагу их напечатать fastreporte заранее спасибо

  • с использованием стилей и события OnGetContentStyle

    if AItem.Index = dbgApartTYPE_NAME.Index then
    if not VarIsNull(ARecord.Values[TcxGridDBTableView(Sender).GetColumnByFieldName('ID_TYPE').Index]) then
    begin
    if not Assigned(AStyle) then
    AStyle := TcxStyle.Create(Sender);

    AStyle.TextColor := GetColorByTypeId(ARecord.Values[TcxGridDBTableView(Sender).GetColumnByFieldName('ID_TYPE').Index]);
    end;

  • А как доработать второй код, чтобы он позволял при этом менять поле ‘SALES’ ?

Ответить на Botanik Отмена ответа

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика