参照下面 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if Column.Field.fieldname = 'FieldName' then begin if (trim(column.Field.Value) = 'FieldVaue') then begin DBGrid1.canvas.font.Color := clblue; DBGrid1.Canvas.Brush.Color := clbtnface; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end end;
procedure TForm1.DBGridEh1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin if Field.FieldName <> 'User' then Exit; if ADOQuery1.FieldByName('User').AsString = '' then begin DBGridEh1.Canvas.Brush.Color := clRed; DBGridEh1.Canvas.FillRect(Rect); DBGridEh1.Canvas.TextOut(Rect.Left,Rect.Top,ADOQuery1.FieldByName(Field.FieldName).AsString); end; end;
TO: bdmh DrawDataCell跟踪里面的事件,不能触发 DefaultDrawing有设置为 True
我用的是默认设置 检查是否有'User' 字段名,区分大小写
TO: bdmh if Field.FieldName <> 'User' then Exit; 我是对这句就设置了断点调试,它没有跳到这里来 'User' 这个字段是有的。并且保证大小写没有错哦。
谢谢各位,可以了 调整后的全部代码 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if Column.Field.fieldname = 'User' then begin if column.Field.Value = Null then begin DBGrid1.canvas.font.Color := clblue; DBGrid1.Canvas.Brush.Color := clbtnface; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end end;
另外我想请教,如果在上面的代码再调整一下 if Column.Field.fieldname = 'User' then 判断这一列, 不单对这列满足条件的单元格改颜色,还改第5列、第6列的背景色呢。
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Column.Field.fieldname = 'FieldName' then
begin
if (trim(column.Field.Value) = 'FieldVaue') then
begin
DBGrid1.canvas.font.Color := clblue;
DBGrid1.Canvas.Brush.Color := clbtnface;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end
end;
procedure TForm1.DBGridEh1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if Field.FieldName <> 'User' then Exit;
if ADOQuery1.FieldByName('User').AsString = '' then
begin
DBGridEh1.Canvas.Brush.Color := clRed;
DBGridEh1.Canvas.FillRect(Rect);
DBGridEh1.Canvas.TextOut(Rect.Left,Rect.Top,ADOQuery1.FieldByName(Field.FieldName).AsString);
end;
end;
控制满足条件的字体颜色
DBGrid1.Canvas.Brush.Color := clbtnface;
控制了该列(整个列的所有单元格)背景颜色先谢谢MAJAPG ,虽然没有解决问题,继续请教。
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
你调试一下就知道了。
DBGridEh.DefaultDrawColumnCell(rect,datacol,column,state);
DrawDataCell跟踪里面的事件,不能触发
DefaultDrawing有设置为 True
检查是否有'User' 字段名,区分大小写
if Field.FieldName <> 'User' then Exit;
我是对这句就设置了断点调试,它没有跳到这里来
'User' 这个字段是有的。并且保证大小写没有错哦。
调整后的全部代码
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Column.Field.fieldname = 'User' then
begin
if column.Field.Value = Null then
begin
DBGrid1.canvas.font.Color := clblue;
DBGrid1.Canvas.Brush.Color := clbtnface;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end
end;
if Column.Field.fieldname = 'User' then 判断这一列,
不单对这列满足条件的单元格改颜色,还改第5列、第6列的背景色呢。