2017-12-01 6 views
2

Ich habe ein Formular in Access 2007, die eine "Update" -Routine hat, die bestimmte Textfelder basierend auf Werten in anderen Feldern (Textfelder, Kontrollkästchen, Kombinationsfelder) aktiviert oder deaktiviert. Der reguläre Betrieb dieser Routine funktioniert gut.Access 2007 Formular: Ereignis NACH rückgängig machen

Jetzt habe ich festgestellt, dass durch Drücken von ESC die Rückgängig-Funktion aufgerufen wird, die die ursprünglichen Werte in allen Feldern wiederherstellt. Diese Zurücksetzung ruft jedoch die Ereignisse in diesen Feldern nicht auf. Daher befindet sich das Formular in einem falschen Status, in dem Textfelder deaktiviert/aktiviert sind, obwohl dies nicht der Fall sein sollte.

Ich fand auch, dass es ein Undo-Ereignis ist, aber das ist für mich nutzlos, da sie vor Undo genannt wird. Ich brauche ein Ereignis nach dem Rückgängigmachen. Was kann ich hier tun, um die Felder zu aktualisieren, wenn ESC gedrückt wird?

Antwort

1

Nun, wie viele Male zuvor habe ich eine Idee für eine Lösung nach Position die Frage.

Die hier Lösung ermöglicht KeyPreview auf die Form und das KeyUp-Ereignis verwenden. Das Rückgängigmachen wird in KeyDown aufgerufen. Wenn KeyUp ausgelöst wird, enthält das Formular bereits wieder die wiederhergestellten Werte und die Aktualisierungsroutine funktioniert.

1

Ich mag diese Lösung mehr, weil es nicht nur auf der „ESC“ -Taste funktioniert:

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 
0

Eine andere Lösung für dieses Problem ist jedes OldValue Eigenschaft des Steuerelements zu verwenden.Durch Versuche habe ich, dass die drei anderen Wert gefunden Eigenschaften der Kontrollen ins Spiel kommen in verschiedenen Situationen:

  • Control.Value oder einfach Control

    • den aktuellen Wert der Kontrolle die meisten der Zeit
    • Wenn das Steuerelement den Fokus hat, ist dies der Wert, den das Steuerelement vor dem Fokussieren hatte
    • Während eines Form.Undo Ereignis, es ist der Wert der Kontrolle vor dem Undo
    • Relevante während der Control.AfterUpdate und Control.Undo Ereignisse
  • Control.Text

    • Der Wert der Kontrolle, während es
    • Fokus hat
    • Relevant während Ereignissen, die auftreten, wenn der Benutzer eingibt, z. B. Control.Change, Control.KeyUp, Control.KeyDown
  • Control.OldValue

    • Der Wert der Steuer hatte, als der aktuelle Datensatz ersten
    • auch den Wert, dass eine Formularebene Undo das Steuerelement
    • Relevant wird zurückgesetzt wurde geöffnet während des Form.Undo Ereignisses

Die Timer-basierte Antwort auf diese Frage ist meine Go-to-Lösung, aber wenn Sie bereits Veranstaltungen wie die Benutzertypen (zB für Live-Validierung) Handhabung, dann Code wie dies kann sinnvoll sein:

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 

Beachten Sie, dass diese Methode nicht Zugriff auf den Post-Form-Rückgängig-Wert von Control.Column(x) Combo/List-Felder erhält. Sie können es erhalten, indem Sie DLOOKUP auf Control.OldValue verwenden, aber Sie sind wahrscheinlich besser dran, wenn Sie stattdessen die zeitgesteuerte Lösung verwenden.