【发布时间】:2012-12-12 06:54:29
【问题描述】:
当 dgRowSelect = False 我如何检测 OnDrawColumnCell 方法中的选定行?
不是选定的单元格,而是包含选定单元格的行。
【问题讨论】:
当 dgRowSelect = False 我如何检测 OnDrawColumnCell 方法中的选定行?
不是选定的单元格,而是包含选定单元格的行。
【问题讨论】:
下面的代码似乎有效。 TDBGrid 仍然保持 SelectedRows 更新(即使在未启用 dgRowSelect 的情况下它不会与它们一起绘制),因此您仍然可以在绘图代码中访问它们。 (您仍然需要启用dgMultiSelect,即使不需要dgRowSelect。)
代码让网格完成所有绘图,只需在选定行上设置Canvas.Brush.Color。如果该单元格的状态恰好是gdSelected,则提供的颜色将被单个单元格的绘图代码覆盖。
我已将所选行的颜色设置为 clFuchsia,并将所选单元格的默认颜色设置为清晰起见(网格是 ugly 与 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;不过,我发现它令人困惑,因为未选择行的当前单元格与所选行的颜色完全匹配。如果它们直接相邻,在视觉上会很烦人。
【讨论】:
:= clF 出现拼写错误,我想“这到底是怎么回事?无论如何,它会很清楚。”然后按 Enter。当我运行它(并抓住屏幕盖)时,它真的很清楚代码的效果是什么,我决定离开它。 ;-)