2013-09-24 67 views
7

Tôi có biểu mẫu Truy cập với hộp văn bản có nghĩa là cho phép nhập nhiều lần số, nhấn enter và cho phép tập lệnh thực hiện. Đối với tốc độ, trường sẽ giữ tiêu điểm sau khi hoàn thành DoStuff().Tại sao .setfocus của tôi bị bỏ qua?

Tuy nhiên, trong khi tôi chắc chắn rằng DoStuff() được chạy, tiêu điểm luôn chuyển đến trường tiếp theo trong thứ tự tab. Nó giống như Me.MyFld.SetFocus đang bị bỏ qua.

Làm cách nào để giữ tiêu điểm trên trường này sau khi hoàn thành DoStuff()?

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

thử sự kiện phù hợp hơn - AfterUpdate của hộp văn bản – 4dmonster

+0

Bạn đã cố gắng bước qua với debugger để xem nếu bất cứ điều gì khác đang chạy sau khi 'phương pháp SetFocus' của bạn? – techturtle

+0

@ 4dmonster, nếu tôi sử dụng một sự kiện khác, làm cách nào để biết liệu phím bấm hiện tại có phải là khóa nhập không? 'AfterUpdate' không bao gồm điều đó và' OnKeyPress' là dành cho các ký tự thông thường, không phải là phím enter (hoặc vì vậy tôi đã đọc) – PowerUser

Trả lời

12

Nếu bạn nhìn vào the order of events for a keypress that would change focus, bạn có thể thấy rằng nó luôn sau mô hình này:

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus 

Bạn có thể tái thiết lập sự tập trung bất cứ nơi nào trong đó và nó vẫn sẽ tiếp tục theo mô hình. Vì vậy, chúng ta cần phải nói nó dừng lại theo mô hình. Thay thế Me.MyFld.SetFocus của bạn bằng DoCmd.CancelEvent và nó sẽ khắc phục được sự cố của bạn. Về cơ bản, điều này chỉ đá bạn ra khỏi mô hình trên, vì vậy các sự kiện ExitLostFocus không bao giờ ...

+0

+1 để cung cấp nguồn của bạn. Tôi đã tạo ra không có những sự kiện cho hộp văn bản này, vì vậy tôi lúc đầu không thấy làm thế nào điều này quan trọng (có lẽ có một phím Tab tiềm ẩn báo chí trong một trong số họ?) Tuy nhiên, 'DoCmd.CancelEvent' hoạt động chính xác như tôi muốn :) – PowerUser

+0

Những sự kiện đó kích hoạt cho bất kỳ dự án nào, cho dù bạn đã thêm mã tùy chỉnh vào chúng hay chưa. Khi bạn đã nhấn phím enter, nó sẽ bắt đầu chuỗi này. Sau khi nó đã hoàn thành các sự kiện Exit và LostFocus trên TextBox đầu tiên của bạn, nó sẽ tiếp tục điều khiển tiếp theo trong thứ tự tab và khởi chạy các sự kiện của nó: 'Enter → GotFocus → KeyPress → KeyUp' – techturtle

+2

Tôi phải hỏi. Sau khi 'LostFocus' thực hiện trên hộp văn bản đầu tiên, tại sao nó sẽ đi đến điều khiển tiếp theo trong thứ tự tab? Người dùng không nhấn Tab, chỉ nhập. – PowerUser

5

Giải pháp thay thế sẽ chuyển trọng tâm sang điều khiển khác và sau đó quay lại điều khiển đầu tiên. Như thế này:

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