【问题标题】:Which event is fired before current record changes in ADOQuery and how NOT to change the current record?在 ADOQuery 中的当前记录更改之前触发哪个事件以及如何不更改当前记录?
【发布时间】:2010-01-18 12:28:03
【问题描述】:

在我的应用程序中,这些数据组件是这样链接的:

DBGrid > (DataSource > ADOQuery > ADOConnection)
DBNavigator > (DataSource > ADOQuery > ADOConnection)

每当用户从 DBGrid 中选择不同的行或使用 DBNavigator 时,ADOQuery 的当前记录都会更改。很好,但是当用户对当前记录进行一些更改,然后离开它时,所做的更改会丢失。

我想显示一个确认对话框,用户需要在其中确认导航离开当前记录,以防发生任何更改。而且,当用户单击“否”时,我希望应用程序不要更改当前记录。

我应该在哪里插入代码?在用户离开当前记录之前触发了哪个事件,如何阻止操作继续?

if anythingChanged then
  if messageDlg(...)=mrNo then
    ADOQuery.dontChangeCurrentRecord;

【问题讨论】:

    标签: delphi events event-handling delphi-2009 ado


    【解决方案1】:

    在 'BeforeScroll' 上设置条件中止;

    procedure TForm1.ADOQuery1BeforeScroll(DataSet: TDataSet);
    begin
      if TAdoQuery(DataSet).Modified then  //if anythingChanged then
        Abort;
    end;
    

    【讨论】:

    • 呜呜!在等待这个答案的 33 分钟内,我设法发现这是我需要摆弄的 BeforeScroll 事件,但我不知道静默中止技巧:-$ 非常感谢!
    • 请注意,BeforeScroll 并不涵盖所有情况(例如有人关闭数据集,或者只是刷新数据集)。我曾经写过一个 TRecordArrivedNotifier(基于 TDataLinkReflector),当你到达一个新记录时会触发一个事件。您可以将其用作发射“中止”的基础。在此处查看我的演讲“具有数据库和数据感知控件的更智能代码”:wiert.wordpress.com/…
    【解决方案2】:

    奇怪。您正在使用哪种网格在这种情况下不会自动调用 Post?

    如果你想做这样的事情,如果网格没有为它提供方便的事件,放置事件处理程序的最佳位置可能是数据集的 BeforeScroll 事件。要阻止应用更改,您可以致电Abort

    【讨论】:

    • 没有在网格中进行更改。网格是只读的,但屏幕的其余部分会根据当前选定的记录刷新。感谢 Sertac Akyuz,我的问题现在解决了。您的解决方案实际上是相同的。也谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2011-12-05
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多