¿Cómo colore con un CXGRID en función del valor de la tabla?
-
08-09-2020 - |
Pregunta
Me gustaría todas las filas donde, en particular, el nombre de campo 'Hola' está presente para hacerse de color
verde.Probé esto en customdrawcell
:
if abstable1.fieldbyname('somename').asstring = 'Hello' then
cxgrid.canvas.brush.color:=clGreen
Pero no funciona ... ¿Qué estoy perdiendo aquí?
Solución
No intente cambiar los colores de lienzo en la cuadrícula.Más bien, y encuentro esto a Siempre sea verdadero: cambie los colores en el controlador de Ondrawcell de , como en este ejemplo:
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;
El CXGRID es solo un contenedor para las vistas.Las vistas son donde se produce toda la pintura. s
Otros consejos
Utilice el evento ONGETCONTENTSTYLEY para las columnas individuales o el objeto de cuadrícula.Los estilos son mucho más fáciles de trabajar que el jugador con el lienzo.
Debe analizar los datos internos para cada fila de vista, más bien, los datos de la posición actual en la tabla.También haga uso del lienzo provisto en el evento 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;
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;
Aquí hay algún código de trabajo de un programa mío que hace algo similar.
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 es la cuadrícula, y qdockets es la consulta que se muestra dentro de la cuadrícula.Ciertas columnas pueden dibujarse en un color diferente dependiendo del valor que se muestre, y en un caso (qdocketsurgent= 1), se cambia el color de fondo de la línea completa.