Delphi / C++ Builder - 在 TDBGrid 中设置 active/selected 行颜色
Delphi / C++ Builder - Set active/selected row color in TDBGrid
我想在 TDBGrid 控件中设置 active/selected 行的背景颜色。
使用 OnDrawColumnCell 事件:
1) 如果 DBGrid 具有选项 dgMultiSelect,则以下代码将起作用,否则,什么也不会发生:
if ( grid->SelectedRows->CurrentRowSelected ) {
grid->Canvas->Brush->Color = clBlue;
}
2) 如果 DBGrid 有选项 dgRowSelect,下面的代码将工作,如果没有,只有选定的 CELL,而不是整行,将被着色:
if ( State.Contains(gdSelected) ) {
grid->Canvas->Brush->Color = clBlue;
}
如何在不使用 dgRowSelect 或 dgMultiSelect 的情况下为整个 active/selected 行着色?
An OnDrawColumnCell event handler can call the DefaultDrawColumnCell
method to instruct the data-aware grid to write the data value in the
cell.
像这样使用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 活动行。
- 我们需要获取当前行的顶部位置。
定义一个 class 继承 TDBGrid 以创建 CellRect、Col 和 Row public:
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;
我想在 TDBGrid 控件中设置 active/selected 行的背景颜色。
使用 OnDrawColumnCell 事件:
1) 如果 DBGrid 具有选项 dgMultiSelect,则以下代码将起作用,否则,什么也不会发生:
if ( grid->SelectedRows->CurrentRowSelected ) {
grid->Canvas->Brush->Color = clBlue;
}
2) 如果 DBGrid 有选项 dgRowSelect,下面的代码将工作,如果没有,只有选定的 CELL,而不是整行,将被着色:
if ( State.Contains(gdSelected) ) {
grid->Canvas->Brush->Color = clBlue;
}
如何在不使用 dgRowSelect 或 dgMultiSelect 的情况下为整个 active/selected 行着色?
An OnDrawColumnCell event handler can call the DefaultDrawColumnCell method to instruct the data-aware grid to write the data value in the cell.
像这样使用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 活动行。
- 我们需要获取当前行的顶部位置。
定义一个 class 继承 TDBGrid 以创建 CellRect、Col 和 Row public:
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;