Wie färbe ich ein cxgrid basierend auf dem Tabellenwert ein?
-
08-09-2020 - |
Frage
Ich möchte alle Zeilen, in denen insbesondere Feldname 'Hallo' vorhanden ist, um grün zu werden.Ich habe das anprobiert customdrawcell
:
if abstable1.fieldbyname('somename').asstring = 'Hello' then
cxgrid.canvas.brush.color:=clGreen
Aber es wird nicht funktionieren...Was fehlt mir hier?
Lösung
Versuchen Sie nicht, die Leinwandfarben im Raster zu ändern.Eher – und ich finde das so stets Sei wahr – ändere die Farben in der Sicht's OnDrawCell-Handler, wie in diesem Beispiel:
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;
Das cxGrid ist nur ein Container für Ansichten.Ansichten sind der Ort, an dem die gesamte Malerei stattfindet.S
Andere Tipps
Verwenden Sie das OnGetContentStyle-Ereignis entweder für einzelne Spalten oder das Rasterobjekt.Es ist viel einfacher, mit Stilen zu arbeiten, als mit der Leinwand herumzuspielen.
Sie müssen sich die internen Daten für jede Ansichtszeile ansehen und nicht die Daten der aktuellen Position in der Tabelle.Nutzen Sie auch die im OnCustomDrawCell()-Ereignis bereitgestellte Leinwand.
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;
Hier ist ein funktionierender Code aus einem meiner Programme, der etwas Ähnliches tut.
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 ist das Raster und qDockets ist die Abfrage, die im Raster angezeigt wird.Bestimmte Spalten werden je nach angezeigtem Wert möglicherweise in einer anderen Farbe gezeichnet, und in einem Fall (qDocketsUrgent = 1) wird die Hintergrundfarbe der gesamten Zeile geändert.