Forms Access 2007表单:撤消后的事件
我在Access 2007中有一个表单,它有一个“更新”例程,根据其他字段(文本框、复选框、组合框)中的值启用或禁用某些文本框。这一例行程序的正常运行效果良好 现在我发现按ESC键调用undo函数,该函数将恢复所有字段中的原始值。但此撤消操作不会调用这些字段上的事件,因此表单处于错误状态,文本框处于禁用/启用状态,尽管它们不应该处于禁用/启用状态Forms Access 2007表单:撤消后的事件,forms,ms-access,vba,ms-access-2007,keyevent,Forms,Ms Access,Vba,Ms Access 2007,Keyevent,我在Access 2007中有一个表单,它有一个“更新”例程,根据其他字段(文本框、复选框、组合框)中的值启用或禁用某些文本框。这一例行程序的正常运行效果良好 现在我发现按ESC键调用undo函数,该函数将恢复所有字段中的原始值。但此撤消操作不会调用这些字段上的事件,因此表单处于错误状态,文本框处于禁用/启用状态,尽管它们不应该处于禁用/启用状态 我还发现有一个undo事件,但这对我来说是无用的,因为它是在undo之前调用的。撤销后我需要一个事件。按下ESC键时,我可以在这里做些什么来更新字段?
我还发现有一个undo事件,但这对我来说是无用的,因为它是在undo之前调用的。撤销后我需要一个事件。按下ESC键时,我可以在这里做些什么来更新字段?好吧,就像我在发布问题后想出解决方案之前的很多次一样
这里的解决方案是在表单上启用KeyPreview并使用KeyUp事件。撤销是在KeyDown上调用的,因此当KeyUp被提升时,表单已经再次具有恢复的值,并且更新例程可以工作。我更喜欢这个解决方案,因为它不仅可以在“ESC”-键上工作:
这个问题的另一个解决方案是使用每个控件的
OldValue
属性。通过实验,我发现控件的三种不同值属性在不同的情况下发挥作用:
或简单地控件。值
控件
- 大多数时候控件的当前值
- 当控件具有焦点时,它是控件在获得焦点之前具有的值
- 在
事件期间,它是控件在撤销之前的值Form.Undo
- 在
和控制期间相关。更新后
事件控制。撤消
控件.文本
- 控件具有焦点时的值
- 在用户键入时发生的事件期间相关,例如
,Control.Change
,Control.KeyUp
Control.KeyDown
控件.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
Private Sub LastName\u Change()
ValidateLastName SourceProperty:=“文本”
端接头
私有子LastName_Undo(取消为整数)
ValidateLastName SourceProperty:=“值”
端接头
私有子表单\u撤消(取消为整数)
ValidateLastName SourceProperty:=“OldValue”
端接头
私有子ValidateLastName(SourceProperty作为变量)
将LastName设置为字符串
选择案例SourceProperty
案例“LastName”
LastName=Nz(Me.LastName.Text,“”)
案例“价值”
LastName=Nz(Me.LastName.Value,“”)
案例“OldValue”
LastName=Nz(Me.LastName.OldValue,“”)
其他情况
调试。打印“ValidateLastName中的无效大小写”
出口接头
结束选择
'
端接头
请注意,此方法无法访问组合框/列表框的Control.Column(x)
的post Form Undo值。您可以通过在Control.OldValue
上使用DLOOKUP
来获得它,但您最好还是使用基于计时器的解决方案
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