【问题标题】: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 属性。通过实验,我发现控件的三个不同的值属性在不同的情况下会发挥作用:

        • Control.Value 或干脆 Control

          • 大部分时间控件的当前值
          • 当控件具有焦点时,它是控件在获得焦点之前的值
          • Form.Undo 事件期间,它是 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 来获得它,但最好还是使用基于计时器的解决方案。

        【讨论】:

          猜你喜欢
          • 2011-05-15
          • 1970-01-01
          • 2013-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多