【发布时间】:2016-07-21 02:03:03
【问题描述】:
RowSelect 破坏了 OnCellClick 的功能,所以我需要关闭 RowSelect。 那么如何通过突出显示当前行的所有单元格来模拟行选择的外观呢?
【问题讨论】:
-
这个问题本质上不是问如何修复 RowSelect 吗?这个 RowSelect-OnCellClick 不兼容错误是否记录在某处?
-
你完全正确,对不起。评论已删除。
RowSelect 破坏了 OnCellClick 的功能,所以我需要关闭 RowSelect。 那么如何通过突出显示当前行的所有单元格来模拟行选择的外观呢?
【问题讨论】:
这对我有用(dgRowSelect=False 和 dgMultiSelect=False):
声明 DBGrid 和 GridDataLink 的 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;
【讨论】:
使用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;
【讨论】:
dgRowSelect = False 跟踪所选行有不同的问题,请提出一个新问题。 :-)