【问题标题】:Updating DBGrids in Master-Detail views when updating Cells in Delphi在 Delphi 中更新单元格时更新主从视图中的 DBGrid
【发布时间】:2011-09-26 00:29:25
【问题描述】:

我正在使用 TADOConn 和 TADODataSet 单元提取数据并连接到 TDataSources 和 TDBGrids。我的 DBGrids 正确显示信息,并且在详细视图中编辑信息准确反映在后备数据库中。

我想做的是让更新详细 DBGrid 中的字段导致两个数据集的刷新,以便始终显示最新的数据。

我尝试将刷新调用放在不同级别的数据库访问的多个事件处理程序中,但它们似乎都有类似(但不同)的重新进入问题。

到目前为止,我能想到的最好方法是通过在详细信息 DBGrid.onColExit 事件上调用刷新来更新主视图。

如果我将刷新调用放在一起,更新的信息将在下次运行应用程序时才会显示。

关于如何实现这一目标的任何想法?我是不是错了,为什么?提前致谢。

【问题讨论】:

    标签: delphi sql-server-2008 ado


    【解决方案1】:

    您暗示您在 DBGrid 中所做的更改已发布到数据库,但不会显示在网格中或在其数据集中进行维护,您必须从数据库中取回它们。我使用的所有数据集组件都维护其数据副本,包括通过它传递到数据库的所有更改。如果您希望数据被触发器或其他进程更改,您可能需要刷新数据。那么您将不得不处理当前记录位置丢失的可能性,即当前记录在数据库中被删除。

    我会尝试使用 Dataset.AfterPost 事件来启动刷新。如果发生奇怪的事情,我会考虑使用 Timer 来延迟刷新。

    【讨论】:

    • 这可能行得通,我会试一试。我认为唯一存在的问题是,无论我在哪里放置延迟,它仍将位于具有重入问题的同一执行线程中。我会发回一些结果。
    • Timer 的一个目的是打破可能导致重入问题的执行链。另一个目的是允许在刷新之前发生其他事情,从而减少所需的刷新次数。
    • 不走运,因为计时器必须在事件处理程序链中的某个地方被触发,我们只是在延迟不可避免的事情。我能想出的唯一解决方案是独立刷新两个数据集的独立更新按钮。
    • 我能够通过多种方式来完成这项工作。我首先添加了一个计时器,然后等待 {insert your event of choice} 被触发。正是在那次事件中,我启动了计时器。因为当我们知道数据已经到达数据库时我们等待启动计时器,所以我们可以确定它会等到我们完成。然后我设置定时器事件方法首先刷新主视图,然后是详细视图。由于计时器事件实际上在执行更新线程之外,我们避免了重入问题并保证数据已经通过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多