2017-04-20 10 views
0

TDBGrid 컨트롤에서 활성/선택된 행의 배경색을 설정하고 싶습니다. DBGrid를가있는 경우 작동Delphi/C++ Builder - TDBGrid에서 활성/선택된 행 색상 설정

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

2) 다음 코드 :

1) DBGrid를가 dgMultiSelect이되지 않을 경우, 아무 일도 발생하지 않는 옵션이있는 경우 다음 코드는 작동합니다

OnDrawColumnCell 이벤트를 사용

옵션 dgRowSelect은, 오직 선택된 셀이 아닌 전체 행은, 착색 될 것입니다하지 않을 경우 : 내가 witho 전체 활성/선택된 행을 색상 수있는 방법

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

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을 정의하고 공공 행 삽입 :

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

안녕 친구 :

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 이벤트에서 현재 셀의 상단을 확인하실 수 있습니다 감사합니다. 나는 이미이 종류의 코드를 사용하고 있으며 이미 행을 페인트하고 있습니다. 내가 알아야 할 것은 dwRowSelect 또는 dgMultiSelect를 설정하지 않고 ACTIVE ROW 만 페인트하는 방법입니다. 즉, 활성 행을 결정하는 방법 (State.Contains (gdSelected) 및 그리드 -> SelectedRows-> CurrentRowSelected는이 경우 작동하지 않음) – sgm

+0

@sgm uptate를 참조하십시오. –

+0

Focused var! – sgm