Delphi / C ++ Builder — установка цвета активной / выбранной строки в TDBGrid

Я хочу установить цвет фона активной / выбранной строки в элементе управления 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?

0

Решение

От 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, чтобы сделать 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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]