2017-04-20 34 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