5

这是我之前的问题Delphi TStringGrid 多选的后续行动 ,确定有关 Delphi 字符串网格的选定行。这是一个不同的问题。

我更仔细地查看了对象的 ONSelectCell 事件 TSelectCellEvent = procedure (Sender: TObject; ACol, ARow: Longint; var CanSelect: Boolean);

我注意到 TStringGrid.Selection.Top,Bottom 属性不一定准确(在事件本身内)。基本上,如果有人从选择多行变为只选择一行,则 selection.* 属性不会更新,而如果选择多行,它们会更新。

无论是否选择了一行或多行,ARow 参数都会更新,但这仅在我可以确定仅选择了一行时才对我有所帮助。

例如,如果只选择了一行,则使用 Arow 参数,如果多于一行,则使用 Selection.* 属性来确定当前选择了哪些行。

必须有一个更简单的方法......

谢谢!

4

4 回答 4

4
于 2011-05-18T06:15:31.200 回答
0
for RowIndex := StringGrid1.Selection.Top to StringGrid1.Selection.Bottom do
begin
  DoSomethingWithRow(RowIndex);
end;

是的,我明白你的意思。似乎在OnSelectCell 事件之后更新了 Selection 属性,因此在事件中您只有旧值(即在 select 事件之前)。答案是将上面的代码移动到 stringgrid 的 OnMouseUp 事件。它似乎工作正常。

于 2011-05-17T00:53:38.603 回答
0

我能够自己解决这个问题,我最终将 OnDrawCell 事件与 onSelectCell 事件结合使用——我认为这会是一团糟,但结果并不是那么糟糕。

这是我为遇到相同问题的其他人提供的解决方案的摘要。以下是两个关键事实:

  1. TStringGrid.Selection 属性在 OnDrawCell 中总是准确的。
  2. TStringGrid.Selection 属性仅在 OnSelectCell IFF 选择多行时准确。

上市
  previousHighlightCount : 整数;//标志以确保 onDraw 中的必要代码仅在每行选择中调用一次。在 onFormCreate 中初始化为“1”。


程序 Grid.OnDrawCell(...)
开始
...
SelectionCount := Grid.Bottom - Grid.Top;**
if ((SelectionCount = 1) AND (previousHighlightCount 1)) 那么  
开始                                                                               
   网格更新编辑;//您的例程为一行正确更新网格。*    
   previousHighlightCount := 1;
结尾
别的
  previousHighlightCount := PrtEdtGrid.SelectionCount; //多选行的例程在 onSelectCell 事件中,onSeelctCell 适用于多选。
……
结尾;


感谢回复的人!!

于 2011-05-17T20:18:41.380 回答
0

StringGrid1.Selection.Top 到 StringGrid1.Selection.Bottom 对我来说非常有效,因为我使用 onkeypress 事件来选择/取消选择内容。

于 2013-08-27T18:39:39.603 回答