我正在使用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
答案 0 :(得分:3)
虽然还有其他几种可能性,但根据我的经验,填充网格的数据集的AfterScroll事件是捕获行数等变化以及数据集光标移动的最可靠的好地方。你没有说是否要覆盖删除和插入,顺便说一句。