1

当 dgRowSelect = False 我如何检测 OnDrawColumnCell 方法中的选定行?

不是选定的单元格,而是包含选定单元格的行。

4

1 回答 1

8

下面的代码似乎工作。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; 不过,我发现它令人困惑,因为未选择行的当前单元格与所选行的颜色完全匹配。如果它们直接相邻,在视觉上会很烦人。

于 2012-12-11T21:53:04.163 回答