当基础数据集中的记录数为0时,是否可以从DBGrid的最顶行中获取从基础数据集显示的行号,而不是最顶行是当前选定的行大于DBGrid中显示的行数,并且滚动了DBGrid。
这是我的问题。从附加到DBGrid的拖放事件处理程序,我可以使用MyGrid.MouseCoord(X,Y).Y确定drop事件与DBGrid的哪个可见行相关联。当基础数据集包含的记录数小于或等于DBGrid中显示的行数时,此值也是基础数据集中关联记录的行号。
当底层数据集包含的记录多于DBGrid中可见行数时,MyGrid.MouseCoord(X,Y).Y和TDataSet(MyGrid.DataSource.DataSet).RecNo仅在第一行时相同数据集显示在网格的第一行。
在没有选择DBGrid行的情况下,是否有某种方法可以识别DBGrid中最顶层显示记录的基础数据集(或偏移量)中的记录号?我知道如果我实际上选择了DBGrid的最顶行,那么我可以使用TDataSet(MyGrid.DataSource.DataSet).RecNo来获取底层数据集的当前记录号。但是,从DBGrid.OnDragOver或DBGrid.OnDragDrop事件我只有对DBGrid和鼠标坐标的引用(我可以从中确定网格的哪一行是放置的目标)。
例如,如果我可以确定DBGrid在网格的最顶行中的基础数据集中显示第三条记录,我的问题就解决了。同样,如果我可以读取特定行的底层TField(例如,最顶行)而没有选择该行,我就拥有了我需要的东西。但是,我看不到这样做的方法。
任何建议都将不胜感激。
编辑:我之前发布了一篇关于拖放到DBGrid的博客。有了这个新信息,我可以解决以前已知的问题。我将在本周某个时候更新该博客,并且一旦我这样做,就会在这里添加一个指向该博客的链接。
还有一个问题。当可见行的数量小于基础记录的数量时,我们还需要计算在最后一个可见行之后发生的下降。当在最后一个可见行之后删除时,MouseCoord(x,y).Y返回-1。
以下是对Uwe代码的修改,以实现这一目的:
function TDBGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
if Value = -1 then
begin
Result := DataSource.DataSet.RecNo - Row + TopRow + VisibleRowCount
end
else
begin
Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
if dgTitles in Options then
Dec(Result);
end;
end;
编辑:正如我在原始问题中提到的,我对此答案感兴趣,以便在我的代码中修复实现拖放到DBGRid中的行为。有了这个答案,我已经更新了我的拖放行为,我在博客中写过这个更新。您可以在以下网址找到此讨论,包括原始博文的链接:Dragging and Dropping into a DBGrid Revisited
答案 0 :(得分:6)
只要DataSet.RecNo与网格中的可见rownumber之间只有一个偏移量,您就可以从受保护的成员Row和TopRow获取所需的信息,这些信息可以由类助手访问。像这样:
function TDbGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
if dgTitles in Options then
Dec(Result);
end;