【问题标题】:DBGrid - How to set an individual background color?DBGrid - 如何设置单独的背景颜色?
【发布时间】:2019-07-30 09:00:10
【问题描述】:

我正在使用 Delphi 10.2.3 并且想要更改 DBgrid 的背景颜色。 例如,我有一个文本列和一个整数列。 如果值非零,我想根据文本更改整数单元格(在同一行中)的颜色。

我得到了一些想法 how to color DBGrid special cell? 所以我知道如何更改 OnDrawColumnCell 中单元格的颜色。 我可以更改文本的背景。 但是我仍然没有弄清楚如何改变另一个单元格的颜色。 当然这很容易,我只是对显而易见的事情视而不见。

【问题讨论】:

    标签: delphi colors dbgrid


    【解决方案1】:

    下面的代码显示了如何根据 同一网格行的另一列中的值。

    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;
    

    【讨论】:

    • 如果你有时间能接受答案就好了。
    • 抱歉 - 2 小时前就已经在寻找它了。什么也没找到。我完全忘了这是我必须点击的灰色复选标记。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2013-05-06
    • 2016-03-16
    • 2012-09-21
    • 2018-10-19
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多