5

我在一个表单上有两个数据库网格,一个有一个垂直滚动条,另一个没有,即使 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 网格的measurementsDB 网格中消失。

当我将其注释掉时,我可以单击test_runs数据库网格并在没有滚动条消失的情况下在测试运行之间进行交换,但永远无法返回当前测试,因为数据库网格中没有它的条目。

当我第一次开始新测试dataset时,.RecordCount` 当然是零 - 这可能会导致滚动条消失?

但是,随着测量的进行(每隔一秒,基于计时器),我已经检查并且dataset.RecordCount` 的值会增加,所以这里应该是第二次测量后的滚动条吗?或者,一旦控件决定不需要它,我是否必须强制它出现?(使 DB 网格无效并不会导致出现丢失的滚动条)


[更新] 正如@kobik 所建议的,我已将 run_id 设为表上的主自动增量键和test_runs表上的索引measurements。我已经更新了上面给出的表格详细信息。我还将mastersource填充测试 drun 数据库网格的查询设置为测试运行“摘要”数据库网格查询的数据源。

我删除了数据库(我的代码在第一次运行时自动重新创建它)。起初,两个数据库网格都没有垂直滚动条,因为它们都是空的。当我添加第一个测试时,“摘要”数据库网格没有滚动条,因为它只有一个条目,“详细信息”数据库网格在 0 和条目处没有滚动条,滚动条出现在第二组测量中。

我添加了第二次测试运行,并且“sumamry”数据库网格有一个滚动条,因为它现在有两个条目,但是一旦我将第二个条目添加到摘要中,滚动条就从“详细信息”数据库网格中消失了(其中当有一个单一的测试运行时它没有这样做),无论它有多少条目(我在添加每组测量时设置断点并检查measurementsQuery.RecordCount并查看它是否为 0、1、2 ...)

值得指出的是,这只发生在我添加新的测试运行(第一次除外)时。如果我启动该程序,两个数据库网格都具有预期的滚动条(> 1 个条目)。我可以通过摘要单击或鼠标滚轮来显示相应测试运行的详细信息。滚动条永远不会消失——直到我添加一个新的测试运行,它将一行 i 插入到摘要数据库网格中。

[更新]
请参阅https://stackoverflow.com/questions/15399769/why-is-the-vertical-scrollbar-on-a-tdbgrid-not-displayed-redux


4

2 回答 2

9

在阅读了您的评论并查看了您的编辑问题后,我很确定TDBGrid' 的“详细信息”在您的. 这就解释了为什么没有垂直滚动条 -只有当记录 > 1 时才会显示垂直滚动条。DataSetINSERTTDBGrid

您可以通过检查DataSet.RecordCount链接到网格的 来进行简单的测试。它应该显示1


显然,QC 中TDBGrid vertical scrollbar dissappears一个已知问题: .
它从 D7..XE2 一路走来。(甚至可能适用于旧/新版本)。

当您有一个主/详细记录,并且使用 TDBGrid 显示详细信息时,垂直滚动条会随机消失,即使记录多于无法容纳也是如此!您可以看到滚动条的右边框轮廓,包括移动的拇指。就好像网格在滚动条上略微调整了大小。

这对于过滤的数据集也可能是正确的。
因此,您可能希望实施 QC 中建议的解决方法之一。

于 2013-03-07T12:16:26.693 回答
0

我将滚动条设置为 ssBoth。它得到了修复

于 2020-05-04T20:01:30.960 回答