Я хочу установить цвет фона активной / выбранной строки в элементе управления 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?
От 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.
Определите класс, наследующий 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;
Других решений пока нет …