【问题标题】:MS access VBA - me.undo stops afterupdate eventMS 访问 VBA - me.undo 在更新事件后停止
【发布时间】:2017-09-05 07:50:51
【问题描述】:

我在 MS Access 中使用组合框导航到数据条目,并希望 msgbox 询问用户对当前条目所做的更改是否应保存、撤消或是否应取消更新过程。 我在更新前运行的代码如下所示:

If Me.Dirty = True Then
Select Case MsgBox("Keep changes?", vbYesNoCancel)    
Case vbYes
DoCmd.Save

Case vbNo
Me.Undo

Case vbCancel
Cancel = True
End Select
End If

“是”和“否”选项按预期工作。虽然,出于某种原因,我无法绕开我的头,但 Me.undo 阻止事件更新,就好像 Cancel 将设置为 True - 意思是: 表单停留在当前数据,而不是选择数据。

组合框的 AfterUpdate 事件只是运行

DoCmd.SearchForRecord , "", acFirst, "[ID] = " & Str(Nz(Screen.ActiveControl, 0))

我也试过手动控制 Cancel = False 没有任何效果。

【问题讨论】:

  • 首先只有两个选项。要么保存,要么不保存。 2> 使用 form_before_update 事件。
  • 嗯,我认为这是个人喜好问题。我的第一个想法就是这样做并在表单中添加一个“撤消”按钮。不过,按照我现在尝试的方式,这应该是可能的。
  • 我希望因为如果您撤消,则数据不会发生任何变化,因此无需更新任何内容并且事件中止。显然,如果 BeforeUpdate 没有执行,则 AfterUpdate 不会触发。为什么你认为“应该”是可能的?只能有两条路径 - 正如@krish KM 所说 - 保存或不保存。

标签: ms-access combobox vba undo


【解决方案1】:

我希望因为如果您撤消,则数据不会发生任何更改,因此无需更新任何内容并且事件中止

显然,这正是我的方法中的错误。我现在只是将整个东西移到了 AfterUpdate 中,它现在可以正常工作了。

If Me.Dirty = True Then
Select Case MsgBox("Keep changes?", vbYesNoCancel)
Case vbYes
DoCmd.Save
DoCmd.SearchForRecord , "", acFirst, "[ID] = " & Str(Nz(Screen.ActiveControl, 0))
Case vbNo
Me.Undo
DoCmd.SearchForRecord , "", acFirst, "[ID] = " & Str(Nz(Screen.ActiveControl, 0))
Case vbCancel
Cancel = True
End Select
Else
DoCmd.SearchForRecord , "", acFirst, "[ID] = " & Str(Nz(Screen.ActiveControl, 0))
End If

可能不是最干净的解决方案,但它正在做它应该做的。

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2020-11-06
    相关资源
    最近更新 更多