2008-12-01 21 views
7

Tôi có một TextBox control trên Form của tôi. Tôi sử dụng sự kiện Rời khỏi trên điều khiển để xử lý dữ liệu nhập của người dùng. Nó hoạt động tốt nếu người dùng nhấp vào một số điều khiển khác trên biểu mẫu, nhưng thậm chí không bị sa thải khi người dùng đi thẳng đến menu chính. Bất kỳ ý tưởng nào tôi nên sử dụng để kích hoạt nó mọi lúc?WinForms: Textbox Leave event không bị sa thải sau khi vào menu chính

Trả lời

6

Tôi tìm thấy một workaround hợp lý, tôi đặt trọng tâm trên menu chính bằng tay:

EDIT: Theo đề nghị của @TcKs, tôi đã thay đổi sự kiện từ ItemClicked để MenuActivate. Cảm ơn rất nhiều vì đã giúp đỡ!

private void menuStrip1_MenuActivate(object sender, EventArgs e) 
    { 
     menuStrip1.Focus(); 
    } 
+0

Nó chỉ hoạt động cho chuột chứ không phải cho bàn phím. Vui lòng xem chỉnh sửa của tôi. – TcKs

2

Bạn nên sử dụng các sự kiện "Đang xác thực" và "Đã xác thực" để kiểm tra dữ liệu nhập của người dùng. Sau đó, nếu người dùng truy cập điều khiển khác "A" và điều khiển "A" có thuộc tính "CausesValidating" được đặt thành "true" (giá trị mặc định của nó), sự kiện "Xác thực" và "Đã xác thực" sẽ được kích hoạt.

Menu cũng có thuộc tính "CuasesValidating".

Chỉnh sửa: Xin lỗi, tôi quên "CuasesValidating" trong dải trình đơn là chức năng của chúng tôi và không được tích hợp sẵn. Nhưng việc kiểm tra để phê chuẩn là khá đơn giản:

private void menuStrip1_MenuActivate(object sender, EventArgs e) { 
    bool ret = this.Validate(false); 
    if (false == ret) { 
     // user's input is wrong 
    } 
} 

tài khoản bất kỳ ContainerControl thay vì "này", nếu bạn muốn kiểm tra xác nhận trong kiểm soát khác so với hình thức "này". Ví dụ trong MDI Child window.

+0

tôi không thể tìm thấy tài sản CausesValidating trên Toolstripmenuitem hoặc menustrip ... – Stefan

+0

tôi không thể tìm thấy tài sản CausesValidating trên Toolstripmenuitem cũng – Grzenio

0

khi chơi với một menu, bạn phải mô phỏng, bằng cách nào đó, một lostfocus và có thể ghi nhớ nơi nó được trong trường hợp bạn đóng menu mà không làm bất cứ điều gì để tập trung sẽ trở lại vào textbox

1

Có một số trường hợp khi Lostfocus không được kích hoạt, ví dụ như nhấp vào các nút trên thanh công cụ và các mục menu. Tôi sử dụng để giải quyết vấn đề này với biến "LastControl" cục bộ và tự xử lý khi menu được lấy nét.

Có nhiều lý do khiến việc nhấp vào menu không làm mất tiêu điểm của hộp văn bản. Ví dụ: nếu bạn muốn có trình đơn "Chỉnh sửa" có "Dán", "Dán" sẽ hành động dựa vào điều khiển đã tập trung và do đó, nó không được lấy tiêu điểm từ bất kỳ điều khiển nào trên biểu mẫu.

Vì vậy, trình đơn có thể được xem dưới dạng menu ngữ cảnh không lấy tiêu điểm từ điều khiển.

+0

Đủ công bằng mà thực đơn không nên lấy nét từ điều khiển - nhưng mặt khác không có cơ chế để xử lý kịch bản của tôi một cách hợp lý đơn giản. Phương pháp của bạn là OK trong các trường hợp đơn giản, nhưng tôi có một hệ thống phân cấp các điều khiển người dùng được sử dụng trên các biểu mẫu khác nhau, vì vậy tôi thực sự không thể có LastControl – Grzenio

+0

Vâng, tôi đã sẵn sàng đăng một ví dụ được tự động chuyển tiếp InvokeLostFocus (LastControl) khi Menu đã được kích hoạt. Nhưng sau đó tôi thấy workaround của bạn với menustrip1.focus() vì vậy tôi đã không. ;) – Stefan

-1

bạn cần một nhãn 1 pixel mỗi 1 pixel

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave 
    MsgBox("yes") 
End Sub 

Private Sub MenuStrip1_MenuActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate 
    CType(sender, MenuStrip).Tag = ActiveControl 
    Label1.Focus() 
End Sub 

Private Sub MenuStrip1_MenuDeactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate 
    If CType(sender, MenuStrip).Tag Is Control AndAlso CType(CType(sender, MenuStrip).Tag, Control).CanFocus Then 
     CType(CType(sender, MenuStrip).Tag, Control).Focus() 
    End If 
    CType(sender, MenuStrip).Tag = Nothing 
End Sub 
+0

Tôi biết đó là mã VB.Net nhưng nó phải là cùng một logic theo C# – Fredou

+0

Dường như không hoạt động - ActiveControl là mục menu tôi đã nhấp vào :( – Grzenio

Các vấn đề liên quan