2017-04-20 218 views
0

我想设置TDBGrid控件中活动/选定行的背景颜色。Delphi/C++ Builder - 在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?

回答

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. 我们需要获取当前行的顶部位置。

定义类的TDBGrid的是inheritant使CellRect,山口和行公众:

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; 
+0

朋友你好,谢谢你的回答。我已经在使用这种代码并且已经绘制了行。我需要知道的是如何仅绘制ACTIVE ROW,而不设置dgRowSelect或dgMultiSelect。换句话说,如何确定活动行(注意State.Contains(gdSelected)和grid-> SelectedRows-> CurrentRowSelected在这种情况下不起作用) – sgm

+0

@sgm查看更新 –

+0

没有聚焦的var! – sgm

相关问题