查询执行后如何挂钩?

时间:2013-09-05 05:44:00

标签: delphi dbgrid tdbgrid

我正在使用AnyDac和TMS TAdvDbGrid(而不是简单的TDbGrid),如果有任何区别,但我怀疑有一般解决方案。

我有一个数据感知网格,由于屏幕尺寸,最多应显示12行。如果关联的查询返回少于12行,那么我想相应地更改数据库网格的height属性(在新的poisiotned bottom和网格下面留下一些空白空间,而不是在其中)。

如果请求我可以发布代码,但我的问题是我应该在哪个事件处理程序中进行?

我原本以为使用了Query的AfterOpen()处理程序,但这绝不会让人感到厌烦。

还有什么?我可以使用DB Grid的DrawCell()方法,但这会被频繁调用。


[更新]我添加了一些跟踪。我只在主网格上完成了一次(它的OnClick()被调用两次,但我尝试了几次并且它是一致的。)

这是追踪:

2   00:00:25.225 [Detail grid scolled]  11:02:12 AM
2   00:00:25.228 [Detail grid scolled]  11:02:12 AM
2   00:00:25.229 [Detail grid scolled]  11:02:12 AM
2   00:00:25.231 [Detail grid scolled]  11:02:12 AM
2   00:00:25.233 [Detail grid scolled]  11:02:12 AM
2   00:00:25.234 [Clicked master grid]  11:02:12 AM
2   00:00:25.234 [Master grid scolled]  11:02:12 AM
2   00:00:25.325 [Clicked master grid]  11:02:12 AM

我注意到一些事情:

  • 详细网格报告为在主网格被重新显示为单击之前滚动。我猜这只是Windows消息队列,但它看起来确实很奇怪。

  • 报告主网格被点击两次

  • 这2次点击似乎导致2组滚动。第一次报告滚动5次;通过巧合(?),细节网格上有5列。如果有更多,或者滚动处理很重,那么这可能是一个开销(我无法理解设置和清除标志)。理想情况下,我想挂钩只有一次点击的第二个“组”,但我不知道如何。

  • 我可以确认AfterScoll是挂钩的好事。只有当我在当前行的主网格行上时才会调用它(i.s,当细节网格的内容变为chages时)。

有任何意见吗?


[更新++]

由于我使用的是AnyDac TADQuery,我发现我可以分配OrdersADQuery.Command.AfterOpen := OrdersADQueryAfterOpen;,当我点击主网格的非当前行时,该函数将被调用一次。

这对我有用,但如果你认为它会帮助别人,可以随意评论我之前的upate

1 个答案:

答案 0 :(得分:3)

虽然还有其他几种可能性,但根据我的经验,填充网格的数据集的AfterScroll事件是捕获行数等变化以及数据集光标移动的最可靠的好地方。你没有说是否要覆盖删除和插入,顺便说一句。