如何使用dgRowSelect = False跟踪所选行

时间:2012-12-11 21:43:23

标签: delphi tdbgrid

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

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

1 个答案:

答案 0 :(得分: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;

上面的示例结果,选择了第一行和第三行:

enter image description here

当然,您可以使用clHighLight的常用颜色;但我发现它很混乱,因为未选中行的当前单元格与所选行的颜色完全匹配。如果他们直接相邻,那在视觉上很烦人。