如何改变dbgrideh每一行的颜色(100分)

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

jony1

Unregistered / Unconfirmed
GUEST, unregistred user!
我在dbgrideh的DBGridEh1DrawColumnCell加入以下语句,以为能改变每行的颜色,
可是不行
为啥?
procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
if not (gdFixed in State) then
begin
with DBGridEh1.Canvas do
begin
if DataModule1.Query1.fieldbyname('余额')>0 then
Brush.Color := clGreen
else
Brush.Color:=clred;
FillRect(Rect);
Font.Color:=clblack;
TextOut(Rect.Left, Rect.Top, Field.AsString);
end;
end;
end;

end.
 
在它的OnGetCellParam事件处理为好!

procedure TForm1.dbgListGetCellParams(Sender: TObject; Column: TColumnEh;
AFont: TFont; var Background: TColor; State: TGridDrawState);
begin

if not (gdFixed in State) then
begin
if DataModule1.Query1.fieldbyname('余额')>0 then
Background := clGreen
else
Background:=clred;
end;
end;
end;
 
随意控制DBGrid每一行的颜色

Delphi中使用DBGrid控件时,每一列都能按需要随意地改变颜色,但要改变每一行的颜色却很难,那么在

不重新制作新控制件的情况下,有没有好的办法让DBGrid按照用户自己要求随意改变每一行颜色的?答案是

有,下面介绍一种简单的方法。


要改变DBGrid每一行的颜色,只要在ONDrawColumnCell事件中设定要改变颜色的行的条件,并指定DBGrid

的Canvas.Brush.color属性并且把Canvas.pen.mode属性设成pmmask,再调用DBGrid的

DefaultDrawColumnCell方法即可。注意在改变这两个属性前要先保护好原来的Canvas.Brush.color属性

的值,调节器用完成 DefaultDrawColumnCell方法后要把原属性值改回,现以

Delphi/demos/db/clientmd 目录下的演示程序clintproj.dpr 为例子

做简单说明,下面是对程序中的

栅格MemberGrid的合条件的整行进行变色,变成黑体背景黄色的,其它不合条件的行的颜色为正常字体,白

色背景,只在DrawColumnCelL 事件中设条件其它的不变,如下:


procedure TClientForm.MemberGridDrawColumnCell(


Sender: TObject; const Rect: TRect;


DataCol: Integer; Column: TColumn;


State: TGridDrawState);


var


oldcolor:tcolor;


oldpm:tpenmode;


begin


if DM.ProjectTEAM_LEADER.Value =


DM.Emp_ProjEMP_NO.Value then {设定变色的行的条件}


MemberGrid.Canvas.Font.Style := [fsBold];


MemberGrid.DefaultDrawColumnCell


(Rect

DataCol

Column

State);


{上面是演示程序的原内容,以下是增加部分}


if DM.ProjectTEAM_LEADER.Value =


DM.Emp_ProjEMP_NO.Value then {设定变色的行的条件}


begin


oldpm:= MemberGrid.Canvas.pen.mode;


oldcolor:= MemberGrid.Canvas.Brush.color;


MemberGrid.Canvas.Brush.color:=clyellow;


MemberGrid.Canvas.pen.mode:=pmmask;


MemberGrid.DefaultDrawColumnCell


(Rect

DataCol

Column

State);


MemberGrid.Canvas.Brush.color:=oldcolor;


MemberGrid.Canvas.pen.mode:=oldpm;


end;


end;
 
按照指针变化颜色呢,也可以用这种方法?
 
如果我想让dbgrid用2种颜色交替显示行,怎么办?
 
procedure Tsjll.DBGridDrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if dbdata.JLWC.FieldByName('jl').AsString='Error' then
begin
dbgrid.Canvas.Brush.color:=clAqua;//clYellow;//
dbgrid.Canvas.Font.color:=clRed;
end
else
begin
dbgrid.Canvas.Brush.color:=clWhite;
dbgrid.Canvas.Font.color:=clBlue;
end;
dbgrid.Canvas.FillRect(Rect);
dbgrid.Canvas.TextOut(rect.Left+4,rect.Top+4,field.AsString);

end;
 
to zhjwjan:你的问题我告诉你,很简单就几行代码!
在 TDbGridEh 的GetCellParams事件写以下代码:
begin
if Not (gdSelected in State) then
if (Sender as TDBGridEh).SumList.RecNo mod 2 = 0 then
Background :=clInfobk;
end;

 
来晚了。
if (Rect.Top = TStringGrid(DBGrid1).CellRect(TStringGrid(DBGrid1).col,TStringGrid(DBGrid1).row).top) and
(not (gdFocused in State)) then
Dbgrid1.Canvas.Brush.Color := clRed;
DBGrid1.DefaultDrawDataCell(Rect, Column.Field, State);
自己设条件就可以了。
 
后退
顶部