我在一个表单上有两个数据库网格,一个有一个垂直滚动条,另一个没有,即使 DataSource 查询返回的结果多于网格的可见行。
为什么不显示垂直滚动条TDBGrid
?
[更新] Delphi XE2 启动器,使用 AnyDac。
当我第一次启动程序时,数据库网格确实有一个垂直滚动条,但后来它消失了,我缩小了范围,但仍然不明白如何纠正这个问题。
我有两个 MySql 表和两个 DBgrids。一个是所有测试运行的概述,另一个包含在测试运行期间进行的测量的详细信息。当用户单击“摘要”网格的一行时,我会更新“详细信息”网格的查询参数。这有效并且不会删除滚动条。
当我开始新的 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
会导致滚动条从 DB 网格的measurements
DB 网格中消失。
当我将其注释掉时,我可以单击test_runs
数据库网格并在没有滚动条消失的情况下在测试运行之间进行交换,但永远无法返回当前测试,因为数据库网格中没有它的条目。
当我第一次开始新测试dataset
时,.RecordCount` 当然是零 - 这可能会导致滚动条消失?
但是,随着测量的进行(每隔一秒,基于计时器),我已经检查并且dataset
.RecordCount` 的值会增加,所以这里应该是第二次测量后的滚动条吗?或者,一旦控件决定不需要它,我是否必须强制它出现?(使 DB 网格无效并不会导致出现丢失的滚动条)
[更新] 正如@kobik 所建议的,我已将 run_id 设为表上的主自动增量键和test_runs
表上的索引measurements
。我已经更新了上面给出的表格详细信息。我还将mastersource
填充测试 drun 数据库网格的查询设置为测试运行“摘要”数据库网格查询的数据源。
我删除了数据库(我的代码在第一次运行时自动重新创建它)。起初,两个数据库网格都没有垂直滚动条,因为它们都是空的。当我添加第一个测试时,“摘要”数据库网格没有滚动条,因为它只有一个条目,“详细信息”数据库网格在 0 和条目处没有滚动条,滚动条出现在第二组测量中。
我添加了第二次测试运行,并且“sumamry”数据库网格有一个滚动条,因为它现在有两个条目,但是一旦我将第二个条目添加到摘要中,滚动条就从“详细信息”数据库网格中消失了(其中当有一个单一的测试运行时它没有这样做),无论它有多少条目(我在添加每组测量时设置断点并检查measurementsQuery.RecordCount
并查看它是否为 0、1、2 ...)
值得指出的是,这只发生在我添加新的测试运行(第一次除外)时。如果我启动该程序,两个数据库网格都具有预期的滚动条(> 1 个条目)。我可以通过摘要单击或鼠标滚轮来显示相应测试运行的详细信息。滚动条永远不会消失——直到我添加一个新的测试运行,它将一行 i 插入到摘要数据库网格中。