【发布时间】:2013-02-19 16:28:44
【问题描述】:
我在一个表单上有两个数据库网格,一个有垂直滚动条,另一个没有,即使 DataSource 查询返回的结果多于网格的可见行。
为什么TDBGrid上的垂直滚动条不显示?
[更新] Delphi XE2 启动器,使用 AnyDac。
当我第一次启动程序时,数据库网格确实有一个垂直滚动条,但后来它消失了,我缩小了它,但仍然不明白如何纠正这个问题。
我有两个 MySql 表和两个 DBgrid。一个是所有测试运行的概述,另一个包含在测试运行期间进行的测量的详细信息。当用户单击“摘要”网格的一行时,我会更新“详细信息”网格的查询参数。这有效并且不会删除滚动条。
当我开始新的 tets 运行并将新行插入“摘要”表时出现问题 - “详细信息” 表的滚动条消失了!
mysql> describe test_runs;
+------------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-------------+------+-----+-------------------+----------------+
| run_id | int(11) | NO | PRI | NULL | auto_increment |
| start_time_stamp | timestamp | NO | | CURRENT_TIMESTAMP | |
| end_time_stamp | timestamp | YES | | NULL | |
| description | varchar(64) | YES | | NULL | |
+------------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.02 sec)
mysql> describe measurements;
+------------------------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------+------+-----+-------------------+-------+
| run_id | int(11) | NO | MUL | NULL | |
| measurement_time_stamp | timestamp | NO | | CURRENT_TIMESTAMP | |
| ph | float | NO | | NULL | |
| conductivity | float | NO | | NULL | |
| cod | float | NO | | NULL | |
+------------------------+-----------+------+-----+-------------------+-------+
5 rows in set (0.04 sec)
mysql>
AnyDac 查询分别是,
SELECT
run_id,
start_time_stamp,
end_time_stamp,
CONCAT(CONCAT(CONCAT(CONCAT(LPAD(EXTRACT(HOUR FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"),LPAD(EXTRACT(MINUTE FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"), LPAD(EXTRACT(SECOND FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'))) AS duration,
description
FROM
test_runs
ORDER BY
start_time_stamp
DESC
和
SELECT
run_id,
measurement_time_stamp,
ROUND(ph, :float_precision) as ph,
ROUND(conductivity, :float_precision) as conductivity,
ROUND(cod, :float_precision) as cod
FROM
measurements
WHERE
run_id=:run_id
ORDER BY
measurement_time_stamp
DESC
如您所见,measurements 表中有对test_runs 表的引用
当我执行以下 SQL 时,测量表的滚动条消失了:
INSERT INTO
test_runs (start_time_stamp, description)
VALUES
(CURRENT_TIMESTAMP, "<Currently running test>");
SELECT LAST_INSERT_ID() AS run_id
谁能告诉我我做错了什么?感谢 0x000F4240
[更新]再次,问题是当我向test_runs表添加一行时,反映measurements表查询的DB网格的垂直滚动条消失了。
因此,不知何故,一个数据库网格/数据集/表正在影响另一个数据库网格。
实际MySql数据库中的数据是没问题的。
无论我是使用INSERT INTO 的命令和两个特定查询(SQL 在设计时固定且从未更改),还是使用@kobik 建议dataset.append,都会出现问题。
数据库内容很好,数据库内容正确,当我点击摘要test_runs数据库网格时,详细信息measurements数据库网格的内容正确更新。
唯一的问题是在test_runs查询的表中插入一行会导致滚动条从measurements DB网格的DB网格中消失。
当我将其注释掉时,我可以单击test_runs DB 网格并在测试运行之间切换滚动条消失,但永远无法回到当前测试,因为没有在 DB 网格中为其输入。
当我第一次开始新测试时,dataset.RecordCount` 当然是零 - 这可能会导致滚动条消失?
但是,随着测量的进行(每隔一秒,基于计时器),我已经检查过dataset.RecordCount` 的值会增加,所以这里应该是第二次测量后的滚动条吗?或者,一旦控件决定不需要它,我是否必须强制它出现? (使DB网格失效并没有导致丢失的滚动条出现)
[更新]
正如@kobik 所建议的那样,我将run_id 作为test_runs 表上的主要自动增量键和measurements 表上的索引。我已经更新了上面给出的表格详细信息。我还设置了查询的mastersource,该查询填充了测试运行数据库网格到测试运行“摘要”数据库网格查询的数据源。
我删除了数据库(我的代码在第一次运行时会自动重新创建它)。起初,两个数据库网格都没有垂直滚动条,因为它们都是空的。当我添加第一个测试时,“摘要”数据库网格没有滚动条,因为它只有一个条目,“详细信息”数据库网格在 0 和条目处没有滚动条,滚动条出现在第二组测量中。
我添加了第二次测试运行,并且“sumamry”数据库网格有一个滚动条,因为它现在有两个条目,但是一旦我将第二个条目添加到摘要中,滚动条就从“详细信息”数据库中消失了网格(当有一个单一的测试运行时它没有这样做),无论它有多少条目(我在添加每组测量值时断点并检查measurementsQuery.RecordCount并看到它变为0 , 1, 2 ...)
值得指出的是,这只发生在我添加新的测试运行时(不是第一个))。如果我启动该程序,两个数据库网格都具有预期的滚动条(> 1 个条目)。我可以通过摘要单击或鼠标滚轮来显示相应测试运行的详细信息。滚动条永远不会消失 - 直到我添加一个新的测试运行,它会在摘要数据库网格中插入一行。
【问题讨论】:
-
检查这个question的答案并在覆盖的
UpdateScrollbar中使用ShowScrollbar(DBGrid.Handle, SB_VERT, true)。 -
@GuillemVicens +1 我不明白的是,我的一个 DB 网格可以实现这一点,而另一个则不能。我想这是一个财产。我将删除第二个,复制第一个并重命名,看看情况如何,然后回复你。作为您的解决方案,我没有代码可以为第一个网格执行此操作,该网格确实有滚动条。感谢您的帮助
-
我无法重现此问题,而且您没有提供任何允许我们这样做的详细信息。当行或列超出可见空间时,我放置在表单上的每个 DBGrid 都会自动获得垂直(和水平)滚动条,而我无法找到一种方法来避免这种情况发生。 Object Inspector 或 DBGrid.Options 中甚至没有任何内容允许有意配置它;这意味着它很可能是您的代码中的某些内容,或者您没有从数据集中获得您认为的行数。
-
@Ken,甚至更多,显示滚动条
is hardcoded并取决于显示的行,隐藏它并不容易。 -
我绝对会避免在与您的数据库网格链接的数据源上使用
INSERT。虽然我不是说这是你所描述的原因,但可能是。