当底层数据集中的记录数大于DBGrid 中显示的行数,并且 DBGrid 已滚动。
这是我的问题。从附加到 DBGrid 的拖放事件处理程序中,我可以使用 MyGrid.MouseCoord(X,Y).Y 确定放置事件与 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 中的博客。有了这个新信息,我可以解决以前已知的问题。我将在本周的某个时候更新该博客,并在我完成此操作后在此处添加指向该博客的链接。
还有一个问题。当可见行数小于底层记录数时,我们还需要计算在最后一个可见行之后发生的drop。在最后一个可见行之后删除时,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 中的行为。有了这个答案,我已经更新了我的拖放行为,并且我在我的博客中写了这个更新。您可以在以下 URL 找到此讨论,包括原始博客文章的链接:重新访问DBGrid 拖放