我的情景: 我已经构建了一个包含多个输入字段的表单。其中一个文本输入字段有一个底层事件监听器,它捕获“更改”事件。
Private Sub orderID_Change()
If Not IsNull(Me.orderID.Text) Then
Set Me.orders.Recordset = ordermanager.getOrder(Me.orderID.Text)
End If
End Sub
当用户输入特定的订单号时,将为用户已在文本字段中输入的每个字母/符号运行回调。
我的问题: msaccess中是否有可能为特定输入掩码创建时间延迟?
例如:用户正在键入带有一些数字的订单号。当第一个更改事件被触发时,内部计时器功能开始递减计数器。只要现在用户发生了额外的交互,计时器就会耗尽时间并调用底层函数。 如果在此期间,用户进行了额外输入,则应重置计数器。
例如:用户输入“123”
SYSTEM : waiting for input
USER INPUT : 1
SYSTEM : timer 100ms
SYSTEM : timer 80ms
SYSTEM : timer 60ms
SYSTEM : timer 40ms
USER INPUT : 2
SYSTEM : timer 100ms
SYSTEM : timer 80ms
USER INPUT : 3
SYSTEM : timer 100ms
SYSTEM : timer 80ms
SYSTEM : timer 60ms
SYSTEM : timer 40ms
SYSTEM : timer 20ms
SYSTEM : timer 0ms
SYSTEM : Run Routine
答案 0 :(得分:2)
我建议您使用_AfterUpdate事件 - 只需让用户在输入完字符后按Enter键或Tab键。这样它只会发射一次。如果用户暂停寻找某些东西,尝试构建计时器可能无效。
或者如果订单#总是相同的长度(即6),您可以这样做:
Private Sub orderID_Change()
If Len(Me.orderID.Text) < 6 Then
'Debug.Print "len=" & Len(Me.orderID.Text)
Exit Sub
Else
'Debug.Print "Ready to set RS!!"
Set Me.orders.Recordset = ordermanager.getOrder(Me.orderID.Text)
End If
End Sub
答案 1 :(得分:2)
使用表单Timer
事件。在表单加载时将TimerInterval
设置为零。然后,在文本框更改事件中,将TimerInterval
重置为倒计时器值。
注意Me.orderID.Text
是一个文本属性,永远不会为空。因此,在orderID_Change
中检查其长度是否大于零。
Private Sub Form_Load()
Me.TimerInterval = 0
End Sub
Private Sub Form_Timer()
MsgBox "Run routine now"
Me.TimerInterval = 0
End Sub
Private Sub orderID_Change()
'If Not IsNull(Me.orderID.Text) Then
If Len(Me.orderID.Text) > 0 Then
Me.TimerInterval = 1000 ' milliseconds
Else
Me.TimerInterval = 0
End If
End Sub
我在Access 2007中使用示例表单测试了该方法,我认为它可以满足您的要求。如果您想对同一表单上的多个文本框执行此类操作,则此建议不会删除它。