2013-09-24 88 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