当dgRowSelect = False时,如何在OnDrawColumnCell方法中检测选定的行?
不是选定的单元格,而是包含选定单元格的行。
最佳答案
下面的代码似乎有效。 TDBGrid
仍会保持SelectedRows
更新(即使未启用dgRowSelect
时也不会随它们一起绘制),因此您仍然可以在图形代码中访问它们。 (即使不需要dgMultiSelect
,您仍然需要启用dgRowSelect
。)
该代码使网格可以绘制所有图形,只需在所选行上设置Canvas.Brush.Color
。如果单个单元格的状态恰好是gdSelected
,则所提供的颜色将被单个单元格的图形代码覆盖。
我已将所选行的颜色设置为clFuchsia
,并且为清楚起见,仅将所选单元格保留为默认颜色(clFuchsia
所选行的网格很丑陋,但可以进行演示):
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState);
var
Selected: Boolean;
Grid: TDBGrid;
begin
Grid := TDBGrid(Sender);
if not (gdSelected in State) then
begin
Selected := Grid.SelectedRows.CurrentRowSelected;
if Selected then
Grid.Canvas.Brush.Color := clFuchsia;
end;
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
上面的示例结果,并选择了第一行和第三行:
当然,您可以使用通常选择的
clHighLight
颜色。但是,我发现它令人困惑,因为未选中行的当前单元格与选中行的颜色完全匹配。如果它们彼此直接相邻,则视觉上很烦人。关于delphi - 如何使用dgRowSelect = False跟踪选定的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13828991/