【问题标题】:Why is the vertical Scrollbar on a TDBGrid not displayed?为什么不显示 TDBGrid 上的垂直滚动条?
【发布时间】: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 个条目)。我可以通过摘要单击或鼠标滚轮来显示相应测试运行的详细信息。滚动条永远不会消失 - 直到我添加一个新的测试运行,它会在摘要数据库网格中插入一行。

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


【问题讨论】:

  • 检查这个question的答案并在覆盖的UpdateScrollbar中使用ShowScrollbar(DBGrid.Handle, SB_VERT, true)
  • @GuillemVicens +1 我不明白的是,我的一个 DB 网格可以实现这一点,而另一个则不能。我想这是一个财产。我将删除第二个,复制第一个并重命名,看看情况如何,然后回复你。作为您的解决方案,我没有代码可以为第一个网格执行此操作,该网格确实有滚动条。感谢您的帮助
  • 我无法重现此问题,而且您没有提供任何允许我们这样做的详细信息。当行或列超出可见空间时,我放置在表单上的每个 DBGrid 都会自动获得垂直(和水平)滚动条,而我无法找到一种方法来避免这种情况发生。 Object Inspector 或 DBGrid.Options 中甚至没有任何内容允许有意配置它;这意味着它很可能是您的代码中的某些内容,或者您​​没有从数据集中获得您认为的行数。
  • @Ken,甚至更多,显示滚动条 is hardcoded 并取决于显示的行,隐藏它并不容易。
  • 我绝对会避免在与您的数据库网格链接的数据源上使用INSERT。虽然我不是说这是你所描述的原因,但可能是。

标签: delphi tdbgrid


【解决方案1】:

阅读您的 cmets 并查看您的编辑问题后,我很确定 TDBGrid 的“详细信息”DataSet 正在返回一个单曲在您的INSERT 之后记录。这就解释了为什么没有垂直滚动条 - TDBGrid 仅当记录 > 1 时才会显示垂直滚动条。

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


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

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

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

【讨论】:

  • 我想我太笨了,无法使用 DB 网格,因为当我尝试这样做时,它什么也没改变 :-( 只是一个问题 - 我必须这样做吗?我有两个专用查询,一个用于每个 DB 网格,谁的 SQL 在设计时设置并且从不更改。当我插入任一表时,我(重新)使用单个 AnyDac TADCommand,我在运行时设置(切换)文本。我不重用任何一个查询并且它们中的数据之间没有任何关系,除了当用户单击摘要数据库网格时,我将run_id 设置为第二个查询的参数。
  • @Mawg,检查 Delphi dataset 的记录计数,而不是 database 表。在您的表单上放置一个按钮,当您单击它时显示消息yourQry.RecordCount(附加到您的网格的查询或数据集)。
  • "The only problem is that inserting a row into the table of the test_runs query casues the scroll bar to vanish from the DB grid of the measurements DB grid." - 这是意料之中的。您的 details 数据集包含 0 行。当您有 2 条(不是 0 条,不是 1 条)详细记录时(或者当行数多于可见网格时),您是否看到滚动条
  • 这超出了问题范围...查看您的来源,主/详细信息定义是错误的。在DetailsADQuery 中你不需要使用WHERE run_id=:run_id - 你需要设置MasterFields=run_idIndexFieldNames=run_id。不要使用INSERT INTO,使用Append 方法。请先阅读一些主要/详细的 Delphi 教程。一旦你明白了,这真的很容易:)
  • @Mawg,我不太关心这些点。这个 Q 已经变成了一个对其他人无济于事的大沙拉,并且涉及大量信息。你真的需要付出努力,把你的问题分解成更小更准确的问题。
【解决方案2】:

我将滚动条设置为 ssBoth。解决了

【讨论】:

  • Delphi/AnyDac 的哪个版本?这是一个相当古老的问题,任何潜在的错误现在可能已经修复了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多