首先将RowSelect设为True 然后在DrawColumnCell事件中写 if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then begin Canvas.Brush.Color := clBlue; Canvas.Font.Color := clWhite; end
在DBGrid的OnDrawColumnCell事件中. procedure TfrmCaiXianBLDWH.dbgrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState); var oldColor:TColor; oldPenMd:TPenMode; begin oldColor := dbgrid1.Canvas.Brush.Color; oldpenmd := dbgrid1.Canvas.Pen.Mode; //在下面按你自己的要求显示 //根据State判断状态。 if state=gdSelect then begin dbgrid1.Canvas.Brush.Color := $00D2D5FF; dbgrid1.Canvas.Pen.Mode := pmMask; end; if state=gdFocused then begin dbgrid1.Canvas.Brush.Color := $00D2D5FF; dbgrid1.Canvas.Pen.Mode := pmMask; end; if state=gdFixed then begin dbgrid1.Canvas.Brush.Color := $00D2D5FF; dbgrid1.Canvas.Pen.Mode := pmMask; end; dbgrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
在DBGrid的OnDrawColumnCell事件中.我加入 if Print_Select.Count<>0 then begin for I:=0 to Print_Select.Count-1 do//Print_Select是个TSTRINGS,在点击的时候付值,记录点击过的记录。 begin if Print_Select.Strings[I]=F_Data.Query_Query.FieldByName('Flow_ID').AsString then begin DBGrid1.Canvas.Brush.Color := clGray; DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State); Exit; end; end; end;基本实现了整行变色,但是总是我选择后离开本行时才变色。所以还不符合要求。
DefaultDrawing设置为False,这点很重要! 在DBGridr的OnDrawDataCell事件中 //当前是选择状态时 if (gdSelected in State) then with TDBGrid(Sender) do begin Canvas.Brush.Color := 选择状态时的颜色; Canvas.FillRect(Rect); //画出选择条 Canvas.Font.Color := 选择状态时的字体颜色; Canvas.TextOut(Rect.Left + 1,Rect.Top + 1,Field.AsString);//输出当前字段文字,注意这个时候DataSet必须为开的,否则会出错 end else with TDBGrid(Sender) do begin Canvas.Brush.Color := 不是选择状态时的颜色; Canvas.FillRect(Rect); 画出背景 Canvas.Font.Color := 不是选择状态时的字体颜色; Canvas.TextOut(Rect.Left + 1,Rect.Top + 1,Field.AsString);//输出当前字段文字,注意这个时候DataSet必须为开的,否则会出错 end;
{2.DBGridrowColor(给DBGrid隔列着色,在DBGrid的OnDrawColumnCell事件中调用) } procedure DBGridColumnColor(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState; singlecolor:TColor;doublecolor:TColor;selectedcolor:TColor); var dataset:tdataset; dbgrid:tdbgrid; begin dataset:=TDBGrid(Sender).DataSource.DataSet; dbgrid:=TDBGrid(Sender); if (dataset.Recno mod 2) <> 0 then //隔行 begin dbgrid.Canvas.Font.Color := clWhite; dbgrid.Canvas.Brush.Color := singlecolor; //这里设置单元格填充色 dbgrid.Canvas.FillRect(Rect); //这里对相应的单元格进行背景色填充 end else begin dbgrid.Canvas.Font.Color := clWhite; dbgrid.Canvas.Brush.Color :=doublecolor; dbgrid.Canvas.FillRect(Rect); end; //输出内容 dbgrid.Canvas.TextRect( Rect, Rect.Left, Rect.Top, Column.Field.DisplayText); if gdSelected in State then //被选中行的颜色 begin dbgrid.Canvas.Brush.Color :=selectedcolor; dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end;
刚刚作的,试一试,应该符合你的要求,代码没有优化,只是把功能实现了,自己优化一下吧。 DefaultDrawing设置为Falseprocedure TForm1.DBGrid1CellClick(Column: TColumn); begin strPriRow:=IntToStr(DBGrid1.DataSource.DataSet.Recno) + ',' + strPriRow ; //记录选过的行 end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then begin DBGrid1.Canvas.Brush.Color := clred; DBGrid1.Canvas.Font.Color := clWhite; DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State); end else begin if pos(IntToStr(DBGrid1.DataSource.DataSet.Recno),strPriRow) = 0 then begin DBGrid1.Canvas.Brush.Color := clBlue; DBGrid1.Canvas.Font.Color := clWhite; DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State); end else //此处可以优化一下,自己看看吧。 begin DBGrid1.Canvas.Brush.Color := clred; DBGrid1.Canvas.Font.Color := clWhite; DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State); end; endend;
然后在DrawColumnCell事件中写
if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
begin
Canvas.Brush.Color := clBlue;
Canvas.Font.Color := clWhite;
end
procedure TfrmCaiXianBLDWH.dbgrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
var
oldColor:TColor;
oldPenMd:TPenMode;
begin
oldColor := dbgrid1.Canvas.Brush.Color;
oldpenmd := dbgrid1.Canvas.Pen.Mode;
//在下面按你自己的要求显示
//根据State判断状态。
if state=gdSelect then
begin
dbgrid1.Canvas.Brush.Color := $00D2D5FF;
dbgrid1.Canvas.Pen.Mode := pmMask;
end;
if state=gdFocused then
begin
dbgrid1.Canvas.Brush.Color := $00D2D5FF;
dbgrid1.Canvas.Pen.Mode := pmMask;
end;
if state=gdFixed then
begin
dbgrid1.Canvas.Brush.Color := $00D2D5FF;
dbgrid1.Canvas.Pen.Mode := pmMask;
end;
dbgrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
dbgrid1.Canvas.Brush.Color := oldcolor;
dbgrid1.Canvas.Pen.Mode := oldpenmd;
end;
if Print_Select.Count<>0 then
begin
for I:=0 to Print_Select.Count-1 do//Print_Select是个TSTRINGS,在点击的时候付值,记录点击过的记录。
begin
if Print_Select.Strings[I]=F_Data.Query_Query.FieldByName('Flow_ID').AsString then
begin
DBGrid1.Canvas.Brush.Color := clGray;
DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
Exit;
end;
end;
end;基本实现了整行变色,但是总是我选择后离开本行时才变色。所以还不符合要求。
在DBGridr的OnDrawDataCell事件中
//当前是选择状态时
if (gdSelected in State) then
with TDBGrid(Sender) do
begin
Canvas.Brush.Color := 选择状态时的颜色;
Canvas.FillRect(Rect); //画出选择条
Canvas.Font.Color := 选择状态时的字体颜色;
Canvas.TextOut(Rect.Left + 1,Rect.Top + 1,Field.AsString);//输出当前字段文字,注意这个时候DataSet必须为开的,否则会出错
end
else
with TDBGrid(Sender) do
begin
Canvas.Brush.Color := 不是选择状态时的颜色;
Canvas.FillRect(Rect); 画出背景
Canvas.Font.Color := 不是选择状态时的字体颜色;
Canvas.TextOut(Rect.Left + 1,Rect.Top + 1,Field.AsString);//输出当前字段文字,注意这个时候DataSet必须为开的,否则会出错
end;
procedure DBGridColumnColor(Sender: TObject;const Rect: TRect;
DataCol: Integer; Column: TColumn;State: TGridDrawState;
singlecolor:TColor;doublecolor:TColor;selectedcolor:TColor);
var
dataset:tdataset;
dbgrid:tdbgrid;
begin
dataset:=TDBGrid(Sender).DataSource.DataSet;
dbgrid:=TDBGrid(Sender);
if (dataset.Recno mod 2) <> 0 then //隔行
begin
dbgrid.Canvas.Font.Color := clWhite;
dbgrid.Canvas.Brush.Color := singlecolor; //这里设置单元格填充色
dbgrid.Canvas.FillRect(Rect); //这里对相应的单元格进行背景色填充
end
else
begin
dbgrid.Canvas.Font.Color := clWhite;
dbgrid.Canvas.Brush.Color :=doublecolor;
dbgrid.Canvas.FillRect(Rect);
end; //输出内容
dbgrid.Canvas.TextRect( Rect, Rect.Left, Rect.Top, Column.Field.DisplayText);
if gdSelected in State then //被选中行的颜色
begin
dbgrid.Canvas.Brush.Color :=selectedcolor;
dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
DefaultDrawing设置为Falseprocedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
strPriRow:=IntToStr(DBGrid1.DataSource.DataSet.Recno) + ',' + strPriRow ; //记录选过的行
end;procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
begin
DBGrid1.Canvas.Brush.Color := clred;
DBGrid1.Canvas.Font.Color := clWhite;
DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
end
else
begin
if pos(IntToStr(DBGrid1.DataSource.DataSet.Recno),strPriRow) = 0 then
begin
DBGrid1.Canvas.Brush.Color := clBlue;
DBGrid1.Canvas.Font.Color := clWhite;
DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
end
else //此处可以优化一下,自己看看吧。
begin
DBGrid1.Canvas.Brush.Color := clred;
DBGrid1.Canvas.Font.Color := clWhite;
DBGrid1.DefaultDrawColumnCell(Rect, datacol,column, State);
end;
endend;
我还是在我自己的方法上面改动了一下。在点击事件中加了个repaint方法.感谢大家。