如何为 DBGrid 特殊单元格着色?

Posted

技术标签:

【中文标题】如何为 DBGrid 特殊单元格着色?【英文标题】:how to color DBGrid special cell? 【发布时间】:2014-11-19 20:08:08 【问题描述】:

我有一列只有“是”和“否”值。 我想如果列值为“是”,那么只有单元格背景颜色是红色 否则“否”则背景颜色为黄色 但此代码为整行着色:

if ADOTable1.FieldByName('Clubs').AsString = 'yes' then
begin
  DBGrid1.Canvas.Brush.Color := clRed;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

编辑

感谢您的回复。 我的真实代码是这样的。 “netice”列只有“L、D、W”。

if Column.FieldName = 'netice' then
 begin
 if ADOTable1.FieldByName('netice').AsString = 'L' then
 DBGrid1.Canvas.Brush.Color := clgreen ;
 if ADOTable1.FieldByName('netice').AsString = 'D' then
 DBGrid1.Canvas.Brush.Color := clRed ;
 if ADOTable1.FieldByName('netice').AsString = 'W' then
 DBGrid1.Canvas.Brush.Color := clYellow ;
 end;
 DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
 end;

但我需要 L--绿色,D--红色,W--黄色 我正在使用 Delphi 2010。

【问题讨论】:

感谢您的回复。此代码为行着色。但我只需要为值为“是”或“否”的单元格着色 你确定 Adotable1 是绑定到网格的数据集,还是可能有另一个,你最好使用:var ADS:TDataset; begin Ads := TDBGrid(Sender).DataSource.DataSet; if Column.FieldName = 'netice' then begin if Ads.FieldByName('netice').AsString = 'L' then DBGrid1.Canvas.Brush.Color := clgreen ; ......... @bummi, Column.Field 为您提供准确的链接数据集字段。因此,我在下面的代码中使用了它。但是在这里,我从FieldName 的比较中感觉不太安全(OP 在第一种情况下使用了第一个大写字母,而不是在后一种情况下)。也许like this 的东西可能会起作用。 【参考方案1】:

您需要添加一个条件,将画笔颜色的更改限制在您选择的列中。在代码中可能是:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Field: TField;
begin
  // store the currently rendered cell's column assigned field reference
  // (if any) to the local variable (there's quite expensive getter)
  Field := Column.Field;
  // if the rendered cell's column has assigned a field and this field's
  // name is 'Clubs' (compared without case sensitivity), then, and only
  // then change the brush color...
  if Assigned(Field) and SameText(Field.FieldName, 'Clubs') then
  begin
    if Field.AsString = 'yes' then
      DBGrid1.Canvas.Brush.Color := clRed
    else
      DBGrid1.Canvas.Brush.Color := clYellow;
  end;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Column.FieldName 之前我更喜欢这个,因为Column.FieldName 还不能保证链接数据集中有这样的字段。因此,以这种方式直接访问该字段更安全。

【讨论】:

P.S.尝试选择不同的数据库列类型。字符串不是存储布尔值的最佳选择。【参考方案2】:

你可以这样做:

if Column.FieldName = 'Clubs' then
begin
  if ADOTable1.FieldByName('Clubs').AsString = 'yes' then
    DBGrid1.Canvas.Brush.Color := clRed
  else
    DBGrid1.Canvas.Brush.Color := clYellow;
end;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

【讨论】:

以上是关于如何为 DBGrid 特殊单元格着色?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 JTable 中的单元格着色? [复制]

如何为数字文本着色?

在DBGrid中,单击单元格选择整行,双击又可编辑单元格

如何为 UICollectionView 中的单元格设置可变单元格间距

jface tableviewer,如何为每个单元格使用不同的单元格编辑器?

Delphi中点击DBGrid中某一单元格时,后面出现个按钮可以点进去,出现一个新窗体,进行选择。