Delphi / C 构建器 - 在TDBGrid中设置活动 /选择的行颜色

Delphi / C++ Builder - Set active/selected row color in TDBGrid

本文关键字:活动 设置 选择 颜色 TDBGrid 构建 Delphi      更新时间:2023-10-16

我想在tdbgrid控件中设置活动/选择行的背景颜色。

使用OnDrawColumnCell事件:

1(如果DBGrid具有DGMultiselect,则以下代码将工作,如果没有,则不会发生:

if ( grid->SelectedRows->CurrentRowSelected ) {
    grid->Canvas->Brush->Color = clBlue;
} 

2(如果DBGRID具有选项dgrowselect(如果不是(,则只有选定的单元格(而不是整个行(将被彩色:

if ( State.Contains(gdSelected) ) {
    grid->Canvas->Brush->Color = clBlue;
} 

如何不使用dgrowselect或dgmultiselect?

如何为整个活动/选择的行着色

来自OnDrawColumnCell:

OnDrawColumnCell活动处理程序可以致电DefaultDrawColumnCell 指示数据感知网格以在 单元格。

使用DefaultDrawColumnCell类似。这是Delphi代码,但您可以轻松转换。

procedure TForm1.DBGridDrawColumnCell(Sender: TObject;const Rect: TRect; 
DataCol: Integer; Column: TColumnEh;State: TGridDrawState);
begin
.....    
  DBGrid.Canvas.Brush.Color := clBlue;
  DBGrid.DefaultDrawColumnCell(Rect,DataCol,Column,State);
....

update

如何绘制DBGRID活动行,而不设置Dgrowselect或DGMultiselect。

  1. 我们需要获得当前行的最高位置。

定义一个继承TDBGrid的类,以使CellRect,Col和Row公开:

type
  TMyDBGrid = class(TDBGrid)
  public
    function CellRect(ACol, ARow: Longint): TRect;
    property Col;
    property Row;
  end;
function TMyDBGrid.CellRect(ACol, ARow: Longint): TRect;
begin
  Result := inherited CellRect(ACol, ARow);
end;

现在,我们可以在OnDrawColumnCell事件中检查当前单元格的顶部:

procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var Col,Row : Integer;
begin
  col := TMyDbGrid(DBGrid1).Col;
  row := TMyDbGrid(DBGrid1).Row;
  if (Rect.Top = TMyDBGrid(DBGrid1).CellRect(Col,Row).Top) and
                   (not (gdFocused in State) or not Focused) then
    DBGrid1.Canvas.Brush.Color := clBlue;
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
 end;