【问题标题】:how to keep track of selected rows with dgRowSelect = False如何使用 dgRowSelect = False 跟踪选定的行
【发布时间】:2012-12-12 06:54:29
【问题描述】:

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

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

【问题讨论】:

    标签: delphi tdbgrid


    【解决方案1】:

    下面的代码似乎有效。 TDBGrid 仍然保持 SelectedRows 更新(即使在未启用 dgRowSelect 的情况下它不会与它们一起绘制),因此您仍然可以在绘图代码中访问它们。 (您仍然需要启用dgMultiSelect,即使不需要dgRowSelect。)

    代码让网格完成所有绘图,只需在选定行上设置Canvas.Brush.Color。如果该单元格的状态恰好是gdSelected,则提供的颜色将被单个单元格的绘图代码覆盖。

    我已将所选行的颜色设置为 clFuchsia,并将所选单元格的默认颜色设置为清晰起见(网格是 uglyclFuchsia 所选行,但它作品展示):

    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 机器,但你的答案看起来不错。谢谢。
    • @Ken,感谢您选择紫红色!你的截图真的把我从几乎睡觉的状态中惊醒了 :-) [+1ed]
    • @TLama:是的,那是我的意图。 我正在编写代码,在弹出 Code Insight 时,:= clF 出现拼写错误,我想“这到底是怎么回事?无论如何,它会很清楚。”然后按 Enter。当我运行它(并抓住屏幕盖)时,它真的很清楚代码的效果是什么,我决定离开它。 ;-)
    • 我已经接受这个答案作为回答所提问题,但它仍然不能完全满足我的需求。这个解决方案有两个问题。 1.最初绘制网格时,整行不突出显示。 2. 如果您单击一个单元格,整行会突出显示,但如果您滚动离开,突出显示不会移动到新选择的行/单元格。
    猜你喜欢
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多