如何为 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 特殊单元格着色?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 UICollectionView 中的单元格设置可变单元格间距