2013-09-24 90 views
7

我有一个文本框的访问窗体,意在允许重复键入一个数字,按回车,并让脚本做的东西。对于速度,在DoStuff()完成后,该字段应该保持焦点。为什么我的.setfocus忽略?

但是,虽然我确定DoStuff()正在运行,但焦点始终以Tab键顺序进入下一个字段。这就像Me.MyFld.SetFocus正在被忽略。

DoStuff()完成后,我该如何关注该字段?

Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer) 
    If KeyCode = vbKeyReturn Then 
     DoStuff 
     Me.MyFld.SetFocus 
    End If 
End Sub 
+0

尝试更适合的事件 - 文本框 – 4dmonster

+0

的更新后您是否尝试过通过加强与调试,看看别的就是你'SetFocus'方法之后运行? – techturtle

+0

@ 4dmonster,如果我使用另一个事件,我怎么知道当前按键是否是输入键? 'AfterUpdate'不包括那个,'OnKeyPress'是用于普通字符,而不是输入键(或者我读过) – PowerUser

回答

12

如果你看一下the order of events for a keypress that would change focus,你可以看到,它始终遵循以下模式:

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus 

在那里,你可以重新设置焦点的任何地方,它仍然会继续遵循的模式。所以我们需要告诉它停止遵循这个模式。将Me.MyFld.SetFocus替换为DoCmd.CancelEvent,它会解决您的问题。基本上,这只是把你踢出上述模式,所以ExitLostFocus事件永远不会触发...

+0

+1给你的来源。我没有为这个文本框创建这些事件,所以我起初没有看到这很重要(也许在其中一个隐藏的Tab键按下?)但是,'DoCmd.CancelEvent'正如我想要的那样工作:) – PowerUser

+0

任何项目都会触发这些事件,无论您是否向其中添加了自定义代码。一旦你按下回车键,它就开始这个序列。在完成第一个TextBox的Exit和LostFocus事件后,它将继续按照Tab键顺序执行下一个控件,并启动它的事件:Enter→GotFocus→KeyPress→KeyUp' – techturtle

+2

我必须问。在第一个文本框上执行'LostFocus'之后,为什么会按照Tab键顺序进入下一个控件?用户没有按Tab键,只有输入。 – PowerUser

5

解决方法是将焦点移到另一个控件,然后回到第一个控件。就像这样:

Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer) 
    If KeyCode = vbKeyReturn Then 
     DoStuff 
     Me.anotherControl.SetFocus 
     Me.MyFld.SetFocus 
    End If 
End Sub