Delphi / C++ Builder - 在 TDBGrid 中设置 active/selected 行颜色

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

我想在 TDBGrid 控件中设置 active/selected 行的背景颜色。

使用 OnDrawColumnCell 事件:

1) 如果 DBGrid 具有选项 dgMultiSelect,则以下代码将起作用,否则,什么也不会发生:

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

2) 如果 DBGrid 有选项 dgRowSelect,下面的代码将工作,如果没有,只有选定的 CELL,而不是整行,将被着色:

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

如何在不使用 dgRowSelect 或 dgMultiSelect 的情况下为整个 active/selected 行着色?

来自OnDrawColumnCell

An OnDrawColumnCell event handler can call the DefaultDrawColumnCell method to instruct the data-aware grid to write the data value in the cell.

像这样使用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);
....

更新

如何在不设置 dgRowSelect 或 dgMultiSelect 的情况下绘制 DBGrid 活动行。

  1. 我们需要获取当前行的顶部位置。

定义一个 class 继承 TDBGrid 以创建 CellRect、Col 和 Row public:

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;