如何使DBgrid某字段相同值的行的背景颜色相同? ( 积分: 300 )

  • 主题发起人 主题发起人 jlcsx
  • 开始时间 开始时间
J

jlcsx

Unregistered / Unconfirmed
GUEST, unregistred user!
adoquery1有一个字段:name,值有:A、B、C...
DBgrid已按name字段排序,现在要使所有行中按name值不同行颜色不同(交错),比如所有name值为A的行为灰色,name值为B的行为白色,所有name值为C的行又为灰色,按错进行改变 DBgrid背景色。
 
adoquery1有一个字段:name,值有:A、B、C...
DBgrid已按name字段排序,现在要使所有行中按name值不同行颜色不同(交错),比如所有name值为A的行为灰色,name值为B的行为白色,所有name值为C的行又为灰色,按错进行改变 DBgrid背景色。
 
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if dbgrid1.Fields[0].Value = '2' then
DBGrid1.Canvas.Brush.Color := clGray;
if dbgrid1.Fields[0].Value = '4' then
DBGrid1.Canvas.Brush.Color := clWhite;
if dbgrid1.Fields[0].Value = '3' then
DBGrid1.Canvas.Brush.Color := clGray;
// DBGrid1.Canvas.Font.Color := clBlue;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top , dbgrid1.Fields[0].AsString);
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
to : :ak_2005
name 值是动态的。
 
借ak_2005的代码改改:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
case (TDBGrid(Sender).DataSource.DataSet.RecNo mod 3) do
0:
DBGrid1.Canvas.Brush.Color := clGray;
1:
DBGrid1.Canvas.Brush.Color := clWhite;
2:
DBGrid1.Canvas.Brush.Color := clGray;
end;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top , dbgrid1.Fields[0].AsString);
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
to : :ak_2005 ,:hs-kill
(1)name 值是动态的。 不一定是不1,2,3,是不确定数。
 
值得学习
 
老兄,你仔细看我的代码了吗? 就因为name是不确定的所以我没用name啊,我判断的是记录数.RecNo,否则我修改ak_2005的代码干吗

请你仔细看看别人的回答好吗
 
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
ts:tstrings;//保存不同的数据要用一个SQL查询出来
       //select unique name from 表
//用ADD放入到TS里去   
tsCOLOR:tstrings;//放置颜色,也要初始化的
begin
// ts的初始化不说了
// tsCOLOR的初始化不说了放TS.count种颜色进去

if ts.indexof(dbgrid1.fieldbyname[name].asstring)>0 then
DBGrid1.Canvas.Brush.Color := tscolor.strings[ts.indexof(dbgrid1.fieldbyname[name].asstring)];//取对应的颜色
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top , dbgrid1.fieldbyname[name].AsString);
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
http://www.tommstudio.com/ViewArticles.aspx?ID=775
http://www.tommstudio.com/
这里有许多文章.
 
上面的TS和TSCOLOR都要设置成全局变量在外部初始化
 
to jlcsx:
你的意思是一个取值就一种颜色吗?不可取.
 
这样,声明一动态数组,把那个字段的所有值(不同的-----distinct())都取出来放在数组里面,每一数组元素对应一颜色(可以依次加个数字),在DBGrid1DrawColumnCell里判断一下就可以了.
 
to ak_2005:
例如: 一个表字段为A;
A的值为:
A 对应的颜色应该是:
50 红色
50 红色
48 黑色
42 红色
40 黑色
40 黑色
值不同则颜色不同。

to :boy2002cn
你的方法我也试过好象不行请指教。
 
我只是给了个方法,什么都没实现,至少两个TSTRINGS没初始化
 
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Table.FiledByname('money').asinteger >200 Then //当money>200,就变红!
DBGrid1.Canvas.Font.Color := clred;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
 
//试试这个
var
PrevName: string;
PrevColor: TColor;

//********在查询完成后加入
adoqry.First;
PrevName := adoqry.FieldByName('Name').AsString;
PrevColor := clRed;
//*********

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if adoqry.FieldByName('Name').AsString <> PrevName then
begin
if PrevColor = clRed then
PrevColor := clBlack
else
PrevColor := clRed;
PrevName := adoqry.FieldByName('Name').AsString;
end;
DBGrid1.Canvas.Font.Color := PrevColor;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
多人接受答案了。
 
后退
顶部