Delphi / C ++ Builder - 在TDBGrid

时间:2017-04-20 10:56:10

标签: c++ delphi dbgrid tdbgrid

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

使用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的情况下为整个活动/选定行着色?

1 个答案:

答案 0 :(得分:2)

来自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);
....

<强>更新

如何绘制DBGrid活动行,而不设置dgRowSelect或dgMultiSelect。

  1. 我们需要获得当前行的最高位置。
  2. 定义一个继承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;