【问题标题】:Access 2007 form: event AFTER undo访问 2007 表单:撤消后的事件
【发布时间】:2018-05-15 12:38:48
【问题描述】:
我在 Access 2007 中有一个表单,它有一个“更新”例程,可以根据其他字段(文本框、复选框、组合框)中的值启用或禁用某些文本框。该例程的常规操作运行良好。
现在我发现按 ESC 会调用 undo 函数,它会恢复所有字段中的原始值。但是此撤消不会调用这些字段上的事件,因此表单处于错误状态,其中文本框被禁用/启用,尽管它们不应该。
我还发现有一个撤消事件,但这对我来说没用,因为它是在撤消之前调用的。撤消后我需要一个事件。按下 ESC 时,我可以在这里做什么来更新字段?
【问题讨论】:
标签:
forms
ms-access
vba
ms-access-2007
keyevent
【解决方案1】:
好吧,就像很多次在我提出问题后想出解决方案之前一样。
这里的解决方案是在表单上启用 KeyPreview 并使用 KeyUp 事件。撤消是在 KeyDown 上调用的,因此当 KeyUp 被引发时,表单已经再次具有恢复的值并且更新例程可以工作。
【解决方案2】:
我更喜欢这个解决方案,因为它不仅适用于“ESC”-Key:
private Sub form_Undo(cancel as integer)
afterUndo = true
TimerInterval = 1
end Sub
private Sub Form_Timer()
if afterUndo then
'do something after the Undo-Event
end if
TimerInterval = 0
end Sub
【解决方案3】:
解决这个问题的另一个方法是使用每个控件的OldValue 属性。通过实验,我发现控件的三个不同的值属性在不同的情况下会发挥作用:
这个问题的基于计时器的答案是我的首选解决方案,但如果您已经在处理用户键入的事件(例如,用于实时验证),那么这样的代码可能是明智的:
Private Sub LastName_Change()
ValidateLastName SourceProperty:="Text"
End Sub
Private Sub LastName_Undo(Cancel As Integer)
ValidateLastName SourceProperty:="Value"
End Sub
Private Sub Form_Undo(Cancel As Integer)
ValidateLastName SourceProperty:="OldValue"
End Sub
Private Sub ValidateLastName(SourceProperty As Variant)
Dim LastName As String
Select Case SourceProperty
Case "LastName"
LastName = Nz(Me.LastName.Text, "")
Case "Value"
LastName = Nz(Me.LastName.Value, "")
Case "OldValue"
LastName = Nz(Me.LastName.OldValue, "")
Case Else
Debug.Print "Invalid case in ValidateLastName"
Exit Sub
End Select
' <Do something to validate LastName>
End Sub
请注意,此方法不会让您访问组合/列表框的Control.Column(x) 的表单撤消后值。您可以通过在Control.OldValue 上使用DLOOKUP 来获得它,但最好还是使用基于计时器的解决方案。