前端对数据进行任何更改后,如何强制 DataGridView 重绘或刷新?

问题描述 投票:0回答:1

我有一个 DataGridView,它与 DataTable 进行数据绑定。 DataTable 最初由 MySQL 数据库填充,但连接不是实时的。此 DataTable(tblorderspecs) 有几列,这些列是通过 .Expression 方法自动计算的。这些列中只有一列在 DataGridView 上可见。

tblorderspecs.Columns("Total").Expression = "Convert(Quantity * Cost - BaseTotal + .499999, 'System.Int64')"

用户可以手动编辑 DataGridView 的数量和成本列,从而更新 tblorderspecs,进而触发 tblorderspecs 的“Total”列的计算,进而反映在 DataGridView 中。

这是我的问题。当这一系列事件发生时,DataGridView并不总是重绘/重绘/刷新。这是一个间歇性的问题。我已使用调试器和断点来确定所有步骤都正常工作。如果我在编辑数量或成本列后退出 DataGridViewRow,一切都会按预期进行,并且 DataGridView 会反映更改。如果我只是在编辑数量或成本列后退出单元格并保留在同一行,则 DataGridView 有大约 50/50 的机会显示更新的信息。我使用断点和调试器来尝试弄清楚发生了什么。使用立即窗口,我发现 DataGridView 单元格值正在正确更新,即使屏幕继续显示旧数据也是如此。我再说一遍,DataGridView 保存新数据,但屏幕不反映更新。这向我表明这是用户界面上的重绘/重画/刷新问题。

作为第一步,我尝试在 DataGridView 上使用刷新方法。

DataGrid.Refresh()

这确实解决了我的问题,但它使程序无法使用。每次调用此方法都会有大约 0.25 秒的延迟,这不太实用。我不可能对每次用户在单元格之间移动时出现的这种延迟感到满意。我还要注意,当 DataGridView 自动刷新时,例如当我在行之间移动时,我没有遇到明显的滞后。所以自动刷新比手动刷新效率更高。

我希望我下面列出的三个解决方案中至少有一个是可行的,并且有人可以帮助我实现它们或提供另一种解决方案。谢谢你。

  1. 无论何时用户切换行时自动调用的重绘/重绘/刷新方法都可以设置为在 DataGridView 中更改任何数据时调用。

  2. 无论何时用户切换行时自动调用的重绘/重绘/刷新方法都可以手动调用。

  3. 除了使用 .Refresh() 方法刷新整个 DataGridView 之外,也许还有一种方法可以刷新单个单元格或行。类似于 DataGrid.CurrentRow.Cells("Total").Refresh()。

注意,我不确定还有哪些其他代码可能对我上传有帮助/相关。这是一个大工程。谢谢您的帮助。

vb.net datatable datagridview expression refresh
1个回答
0
投票

我能够使用 DataGridView.Invalidate() 方法解决这个问题。这会强制 DataGridView 重绘,但不会导致 .Refresh() 方法的所有速度减慢。我放置了代码,以便在底层数据表发生更改时使代码无效。

© www.soinside.com 2019 - 2024. All rights reserved.