我想在TDBGrid控件中设置活动/选定行的背景颜色。
使用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的情况下为整个活动/选定行着色?
答案 0 :(得分: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);
....
<强>更新强>
如何绘制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;