2013-09-24 12 views
7

私は、数字を繰り返し入力したり、Enterキーを押したり、スクリプトを実行させたりするためのテキストボックスを持つAccessフォームを持っています。スピードのために、フィールドはDoStuff()が完了した後にフォーカスを保持する必要があります。私の.setfocusはなぜ無視されますか?

しかし、私はDoStuff()が実行されていると確信していますが、フォーカスは常にタブ順の次のフィールドに移動します。それは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

のAfterUpdateあなたは何かがあなたの 'SetFocus'メソッドの後に実行されているかどうかを確認するために、デバッガでステップ実行しようとしたことがありますか? – techturtle

+0

@ 4dmonster、別のイベントを使用している場合、現在のキー押しがEnterキーかどうかをどのように知ることができますか? 'AfterUpdate'にはそれが含まれておらず、' OnKeyPress'は通常の文字であり、Enterキーではありません(または私が読んだ) – PowerUser

答えて

12

あなたはthe order of events for a keypress that would change focusを見れば、あなたはそれがいつもこのパターンに従っていることを見ることができます:

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus 

あなたはどこにでもそこにフォーカスを再設定することができ、それはまだパターンに従って維持されます。それでパターンに従うのをやめるよう伝える必要があります。 Me.MyFld.SetFocusDoCmd.CancelEventに交換してください。問題が解決するはずです。基本的には、これはちょうど上記のパターンからあなたをキックするので、ExitLostFocusイベントは決して発生しません...

+0

あなたのソースを与えるために+1。私はこのテキストボックスのイベントを一切作成していないので、まずはどういうことか分かりません(たぶんTabキーを押しているのでしょうか?)しかし、 'DoCmd.CancelEvent'は、 :) – PowerUser

+0

これらのイベントは、カスタムコードを追加したかどうかにかかわらず、どのプロジェクトでも発生します。エンターキーを押すと、このシーケンスが開始されます。最初のTextBoxでExitイベントとLostFocusイベントを終了すると、タブオーダーの次のコントロールに進み、イベントを起動します: 'Enter→GotFocus→KeyPress→KeyUp' – techturtle

+2

私は質問しなければなりません。最初のTextboxで 'LostFocus'を実行した後、タブ順で次のコントロールに移動するのはなぜですか?ユーザーはTabキーを押さず、Enterだけを押しました。 – 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 
関連する問題