访问2007表格:撤消之后的活动



我在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.AfterUpdateControl.Undo事件期间相关
  • Control.Text

    • 控件的价值在具有焦点
    • 时的价值
    • 在发生用户类型的事件中相关,例如Control.ChangeControl.KeyUpControl.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来获得它,但是您最好只使用基于计时器的解决方案。

最新更新