Как мне покрасить cxgrid на основе табличного значения? - PullRequest
3 голосов
/ 21 мая 2011

Мне бы хотелось, чтобы все строки, в которых присутствует конкретное имя поля 'hello', окрашивались в зеленый цвет.Я попробовал это на customdrawcell:

if abstable1.fieldbyname('somename').asstring = 'Hello' then
  cxgrid.canvas.brush.color:=clGreen

Но это не сработает ... что мне здесь не хватает?

Ответы [ 5 ]

8 голосов
/ 22 мая 2011

Используйте событие OnGetContentStyle для отдельных столбцов или объекта сетки. С стилями работать гораздо проще, чем связываться с холстом.

5 голосов
/ 21 мая 2011

Не пытайтесь изменить цвета холста в сетке.Скорее - и я считаю, что всегда будет правдой - измените цвета в обработчике OnDrawCell View , как в этом примере:

procedure T_fmTabSnapList.View1CustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if abstable1.fieldbyname('somename').asstring = 'Hello' then 
    ACanvas.Brush.Color := clGreen
end;

cxGrid - это просто контейнер для Views.Виды, где все картины происходят.s

4 голосов
/ 24 мая 2011

Вам нужно смотреть на внутренние данные для каждой строки представления, а не на данные текущей позиции в таблице.Также используйте холст, предоставленный в событии OnCustomDrawCell ().

procedure TForm1.YourViewCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if(AViewInfo.GridRecord.Values[YourColumn.Index] = 'Hello') then
    ACanvas.Brush.Color := clGreen;
end;
0 голосов
/ 29 мая 2013
procedure Tfm1.Grid1StylesGetContentStyle(Sender: TcxCustomGridTableView;
  ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
  out AStyle: TcxStyle);
Var
 Style1: TcxStyle;
begin
 if AItem = nil then exit;

 if ARecord.Values[Grid1Med.Index] = true then
   AStyle := cxStyleMed;

 if ARecord.Values[Grid1CP.Index] = true then
   AStyle := cxStyleHost;

 if (ARecord.Values[Grid1Med.Index] = true) and
    (ARecord.Values[Grid1CP.Index] = true) then
   AStyle := cxStyleHostAndCP;

  if not VarIsNull(ARecord.Values[colColor.Index]) then
  begin
    if not Assigned(AStyle) then
      AStyle := TcxStyle.Create(Sender);
    AStyle.Color := ARecord.Values[colColor.Index];
  end;
end;
0 голосов
/ 21 мая 2011

Вот некоторый рабочий код из моей программы, которая делает нечто подобное.

procedure TDoDockets.grDocketsDrawColumnCell(Sender: TObject;
            const Rect: TRect; DataCol: Integer; Column: TColumn;
            State: TGridDrawState);
begin
 with grDockets do
  begin
   if (qDocketsOpenCost.asinteger > 1) and (datacol = 5)
    then canvas.font.color:= clRed;

   if datacol = 9 then // status
    if qDocketsColour.Value <> 0
     then Canvas.font.color:= tcolor (qDocketsColour.Value);

   if datacol = 10 then // attention
    if qDocketsAttention.asinteger = 1
     then canvas.brush.color:= clRed;

   if qDocketsUrgent.asinteger = 1 then canvas.brush.color:= 10092543;
   // light yellow
   DefaultDrawColumnCell (Rect, DataCol, Column, State);
  end
end;

grDockets - это сетка, а qDockets - запрос, отображаемый в сетке. Некоторые столбцы могут быть нарисованы другим цветом в зависимости от отображаемого значения, и в одном случае (qDocketsUrgent = 1) цвет фона всей строки изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...