我正在使用Delphi 10.2.3,并且想要更改DBgrid的背景颜色。 例如,我有一个文本列和一个整数列。 如果值不为零,我想根据文本更改整数单元格(在同一行中)的颜色。
我有一些想法 how to color DBGrid special cell? 所以我知道如何在OnDrawColumnCell中更改单元格的颜色。 我可以更改文本的背景。 但是我仍然不知道如何更改另一个单元格的颜色。 当然,这很容易,而且我对明显的事物视而不见。
答案 0 :(得分:5)
下面的代码显示了如何根据 值位于同一网格行的另一列中。
procedure TForm1.FormCreate(Sender: TObject);
var
AField : TField;
begin
AField := TIntegerField.Create(Self);
AField.FieldKind := fkData;
AField.FieldName := 'ID';
AField.DataSet := ClientDataSet1;
AField := TStringField.Create(Self);
AField.FieldKind := fkData; // Field size defaults to 20
AField.FieldName := 'AValue';
AField.DataSet := ClientDataSet1;
ClientDataSet1.CreateDataSet;
ClientDataSet1.InsertRecord([1, 'One']);
ClientDataSet1.InsertRecord([2, 'Two']);
ClientDataSet1.InsertRecord([3, 'Three']);
DBGrid1.DefaultDrawing := False; // otherwise DBGrid1DrawColumnCell will have no effect
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Column.Index = 1 then begin
if Odd(DBGrid1.Columns[0].Field.AsInteger) then
DBGrid1.Canvas.Brush.Color := clGreen;
end;
DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
end;
如果要根据未显示的值确定单元格颜色 字段(没有网格列的字段),您只需测试该字段的值 在基础数据集中,因为逻辑数据集游标始终保持同步 当前正在绘制的单元格。例如
if Odd(DBGrid1.DataSource.DataSet.Fields[99].AsInteger) then
DBGrid1.Canvas.Brush.Color := clGreen;