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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top