#delphi #devexpress #tcxgrid
#delphi #devexpress #tcxgrid
Вопрос:
Я бы хотел, чтобы все строки, в которых присутствует конкретное имя поля ‘hello’, были окрашены в зеленый цвет. Я пробовал это на customdrawcell
:
if abstable1.fieldbyname('somename').asstring = 'Hello' then
cxgrid.canvas.brush.color:=clGreen
Но это не сработает … чего мне здесь не хватает?
Комментарии:
1. Опубликуйте свой фактический код для всего обработчика событий, а не то, что вы только что придумали для своего вопроса. Кроме того, отформатируйте его, либо сделав отступ на четыре пробела, либо выделив все и нажав кнопку {}, либо нажав Ctrl K. Фактический код позволяет нам увидеть, что не так, или, по крайней мере, скопировать и вставить, чтобы помочь разобраться в этом.
Ответ №1:
Используйте событие OnGetContentStyle либо для отдельных столбцов, либо для объекта grid. Со стилями работать намного проще, чем возиться с canvas.
Комментарии:
1. Да, 100%. Со стилями намного проще работать, а также безопаснее. Отделяя логику, которая выбирает стиль, от того, как должен быть представлен каждый стиль, вы можете свободно изменять один из них без ущерба для другого (например, HTML и CSS). Кроме того, вы также способствуете повторному использованию и стандартизации, поскольку стили могут быть общими для разных сеток.
Ответ №2:
Вам нужно смотреть на внутренние данные для каждой строки представления, а не на данные о текущей позиции в таблице. Также используйте холст, предоставленный в событии 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;
Комментарии:
1. @user763539: будет работать, если у вас есть столбцы просмотра для каждого поля в таблице, и они расположены в одинаковом порядке.
Ответ №3:
Не пытайтесь изменить цвета canvas в сетке. Скорее — и я считаю, что это всегда верно — измените цвета в обработчике OnDrawCell в представлении, как в этом примере:
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 — это просто контейнер для представлений. Виды — это то место, где происходит все рисование.
s
Комментарии:
1. Заставило это работать ….если (AViewInfo.GridRecord. Значения[DataModule2. Доступно 7. Индекс]… Спасибо вам всем…
Ответ №4:
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;
Ответ №5:
Вот некоторый рабочий код из моей программы, которая делает нечто подобное.
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) изменяется цвет фона всей строки.