2017-04-20 3 views
0

TDBGridコントロールのアクティブ/選択された行の背景色を設定します。 OnDrawColumnCellイベントを使用してDelphi/C++ Builder - TDBGridでアクティブな/選択された行の色を設定します。

:DBGridのオプションdgMultiSelectを持っている場合ではない場合

1)次のコードは動作しますが、何も起こりません:

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

2)のDBGridを持っている場合は、次のコードは動作しますオプションdgRowSelectは、いない場合は、選択セルのみは、行全体は、色付けされるわけではありません。

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

どのように私は、全体のアクティブ/選択された行withoを色付けができdgRowSelectまたはdgMultiSelectを使用していますか? OnDrawColumnCellから

答えて

2

アン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); 
.... 

dgRowSelectまたはdgMultiSelectを設定せずに、DBGridのアクティブな行をペイントする方法更新

  1. 現在の行の先頭位置を取得する必要があります。

CellRect、コルを作成し、公共の行にクラスにのTDBGridのinheritantを定義します。

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)とグリッド - > SelectedRows-> CurrentRowSelectedはこの場合は機能しません) – sgm

+0

@sgm uptateを参照してください –

+0

Focused var! – sgm

関連する問題