2013-09-24 16 views
7

Ho un modulo di accesso con una casella di testo che consente di digitare ripetutamente un numero, premere invio e lasciare che uno script faccia qualcosa. Per la velocità, il campo dovrebbe mantenere il fuoco dopo che DoStuff() è terminato.Perché il mio .setfocus è stato ignorato?

Tuttavia, mentre sono sicuro che si esegue DoStuff(), lo stato attivo passa sempre al campo successivo nell'ordine di tabulazione. È come se Me.MyFld.SetFocus fosse ignorato.

Come si mantiene la messa a fuoco su questo campo dopo che DoStuff() è terminato?

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

provare evento più adatto - DopoAggiornamento della casella di testo – 4dmonster

+0

Hai provato passando attraverso con il debugger per vedere se niente altro è in esecuzione dopo che il 'metodo SetFocus'? – techturtle

+0

@ 4dmonster, se utilizzo un altro evento, come faccio a sapere se la pressione corrente del tasto è il tasto Invio? 'AfterUpdate' non lo include e' OnKeyPress' è per caratteri normali, non il tasto invio (o così ho letto) – PowerUser

risposta

12

Se si guarda alla the order of events for a keypress that would change focus, si può vedere che si segue sempre questo schema:

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus 

È possibile re-impostare la messa a fuoco in qualsiasi parte lì e sarà ancora continuare a seguire il modello. Quindi dobbiamo dirgli di smettere di seguire il modello. Sostituisci il tuo Me.MyFld.SetFocus con DoCmd.CancelEvent e dovrebbe risolvere il tuo problema. Fondamentalmente, questo ti esclude dal modello precedente, quindi gli eventi Exit e LostFocus non sparano mai ...

+0

+1 per dare la tua fonte. Non ho creato nessuno di questi eventi per questa casella di testo, quindi inizialmente non vedo come questo sia importante (forse c'è una chiave implicita in uno dei tasti Tab di uno di essi?) Tuttavia, "DoCmd.CancelEvent" funziona esattamente come volevo :) – PowerUser

+0

Questi eventi vengono attivati ​​per qualsiasi progetto, indipendentemente dal fatto che sia stato aggiunto o meno codice personalizzato. Dopo aver premuto il tasto Invio, inizia questa sequenza. Dopo aver terminato gli eventi Exit e LostFocus sul tuo primo TextBox, continuerà il controllo successivo nell'ordine di tabulazione e avvierà i suoi eventi: 'Invio → GotFocus → KeyPress → KeyUp' – techturtle

+2

Devo chiedere. Dopo che 'LostFocus' è stato eseguito sulla prima casella di testo, perché dovrebbe passare al controllo successivo nell'ordine di tabulazione? L'utente non ha premuto Tab, solo Invio. – PowerUser

5

Una soluzione alternativa è spostare lo stato attivo su un altro controllo e quindi tornare al primo controllo. Come questo:

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 
Problemi correlati