当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/

10-13 05:29