我在Access 2007中具有"更新"例程,该表单可以根据其他字段(文本框,复选框,Commoboxes)启用或禁用某些文本框。该例程的常规操作效果很好。
现在,我发现按ESC调用撤消函数,该功能将恢复所有字段中的原始值。但是,此撤消并未调用这些字段上的事件,因此表格处于错误状态,尽管不应该禁用文本框/启用文本框。
我还发现有一个撤消事件,但这对我来说是没有用的,因为它在撤消之前被称为。撤消后我需要一个活动。按下ESC时,我该怎么办才能更新字段?
我更喜欢这个解决方案,因为它不仅可以在" 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
好吧,就像我有很多想法在问题之后有解决方案之前的很多次。
这里的解决方案正在启用表单上的键盘浏览和使用键盘事件。键入时调用了撤消,因此,当键入键盘时,该表格已经再次具有还原值,并且更新例程起作用。
解决此问题的另一个解决方案是使用每个控件的OldValue
属性。通过实验,我发现控件的三个不同值属性在不同的情况下发挥了作用:
-
Control.Value
或简单地Control
- 在大多数时候,控件的当前值
- 当控件具有焦点时,这是控制焦点之前的价值
- 在
Form.Undo
事件中,它是撤消之前的控制值 - 在
Control.AfterUpdate
和Control.Undo
事件期间相关
-
Control.Text
- 控件的价值在具有焦点 时的价值
- 在发生用户类型的事件中相关,例如
Control.Change
,Control.KeyUp
,Control.KeyDown
-
Control.OldValue
- 当前记录首次打开时控件的值
- 同样,形式级别的撤消将重置控件重置为
- 在
Form.Undo
事件中相关
基于计时器的答案是我的首选解决方案,但是如果您已经将事件作为用户类型处理(例如,用于实时验证),那么类似的代码可以明智:
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
来获得它,但是您最好只使用基于计时器的解决方案。