如何在关闭rowselect的情况下在DBGrid中为整行着色?

时间:2012-12-11 16:41:20

标签: delphi tdbgrid

RowSelect打破了OnCellClick的功能,因此我需要关闭RowSelect。 那么,如何通过突出显示当前行的所有单元格来模拟行选择?

2 个答案:

答案 0 :(得分:1)

使用TDBGrid.OnDrawColumnCell事件,并设置State以指示已选中该行。

procedure TfrmPrimaryCare.dbGrdPCClaimsDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  NewState: TGridDrawState;
  RowSelected: Boolean;
begin
  NewState := State;
  RowSelected := (Sender as TDBGrid).SelectedRows.CurrentRowSelected;
  if (RowSelected) then
    NewState := NewState + [gdSelected];
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, NewState);
end;

答案 1 :(得分:1)

这对我有用(dgRowSelect=FalsedgMultiSelect=False):
声明DBGridGridDataLink的hack类型以访问受保护的方法 和两个变量

type
  THackGrid = class(TDBGrid);
  THackDataLink = class(TGridDataLink);
var
  HackGrid: THackGrid;
  HackDataLink: THackDataLink;

OnFormCreate中指定变量以使其在绘图时可用:

procedure TMyForm.FormCreate(Sender: TObject);
begin
  HackGrid := THackGrid(MainGrid);
  HackDataLink := THackDataLink(HackGrid.DataLink);
end;

并使用TGridDataLink.GetActiveRecord测试所选行:

procedure TMyForm.MainGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if Not (gdSelected in State) and (HackGrid.Row = HackDataLink.GetActiveRecord + 1) then
    MainGrid.Canvas.Brush.Color := clInfoBk;

  MainGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
相关问题