2009-12-24 15 views
10

Tôi có biểu mẫu với một số hộp văn bản và các điều khiển khác. Tôi đang sử dụng điều khiển errorprovider và tôi đã kết nối sự kiện xác thực trên mỗi hộp văn bản mà tôi cần xác thực. Sự kiện Xác thực xảy ra khi điều khiển mang lại tiêu điểm cho một điều khiển khác. Vì vậy, sự kiện xảy ra khi bạn sử dụng phím tab để di chuyển ra khỏi điều khiển hiện tại hoặc khi bạn bấm điều khiển khác bằng chuột 1. Và tôi thấy điều đó cực kỳ khó chịu, chỉ để đưa ra một ví dụ, nếu tôi mở biểu mẫu này, và sau đó ngay lập tức cố gắng đóng nó lại, nó sẽ không cho tôi, vì việc xác nhận sẽ kích hoạt phàn nàn rằng hộp văn bản đầu tiên không có văn bản được nhập vào.Xác nhận hợp lệ một số hộp văn bản trên biểu mẫu C# windows cùng một lúc

Hành vi tôi muốn đang sử dụng trình gỡ lỗi, làm cách nào tôi có thể xác thực toàn bộ biểu mẫu chỉ khi tôi nhấp vào nút Lưu của biểu mẫu?

Cảm ơn

+0

+1 Tôi cũng ghét điều đó quá – albertein

Trả lời

10

Kiểm tra tài sản Form.AutoValidate.

Có thể giá trị:

  • Disable

xác nhận Implicit sẽ không xảy ra. Đặt giá trị này sẽ không can thiệp vào các cuộc gọi rõ ràng đến Xác thực hoặc xác thựcTrẻ em.

  • EnablePreventFocusChange

xác nhận ngầm xảy ra khi kiểm soát mất tập trung.

  • EnableAllowFocusChange

xác nhận ngầm xảy ra, nhưng nếu xác nhận thất bại, trọng tâm sẽ vẫn thay đổi các điều khiển mới. Nếu không thể xác thực , sự kiện được xác thực sẽ không kích hoạt.

Đặt nó thành EnableAllowFocusChange sẽ giải quyết vấn đề mở biểu mẫu và cố gắng đóng biểu mẫu ngay lập tức vì tiêu điểm sẽ được chuyển sang nút Hủy.

Nếu bạn muốn kiểm soát hoàn toàn xác thực, bạn có thể đặt thành Disable và thực hiện xác thực thủ công bằng cách sử dụng Form.ValidateForm.ValidateChildren. Tôi không chắc chắn 100% nhưng tôi tin rằng Form.ValidateChildren sẽ không kích hoạt sự kiện xác thực cho các điều khiển được đặt bên trong một TabControl.

+0

Điều này giúp ích đáng kể. – Edwin

0

Không có cách nào để WinForms xác thực điều khiển khi lưu. Không giống như một biểu mẫu web, không có bất kỳ sự kiện "gửi" hoặc "lưu" nào (ít nhất là không có trên biểu mẫu). Bạn có thể lập trình biểu mẫu để xử lý theo cách này, nhưng bạn sẽ không thể sử dụng ràng buộc dữ liệu (Lưu sẽ đặt mô hình và kiểm tra lỗi).

Có lẽ cách tốt hơn là không sử dụng hộp thoại để hiển thị lỗi (tôi giả sử bạn là vì bạn đang nói đây là sự cố khi đóng biểu mẫu). Chú giải công cụ có thể cung cấp trải nghiệm người dùng tốt hơn. Nếu người dùng bỏ qua các chú giải công cụ, bạn có thể cung cấp hộp thoại khi họ nhấn Lưu. Họ sẽ có thể đóng biểu mẫu ngay cả khi có dữ liệu xấu.

0

Đặt thuộc tính CausesValidation trên tất cả các điều khiển (ngoại trừ nút Lưu) thành Sai. Điều này sẽ ngăn chặn sự kiện Xác thực cho tất cả các điều khiển ngoại trừ nút. Nó có thể không phải là hành vi chính xác mà bạn muốn, vì hành vi khó chịu sẽ xảy ra khi bạn thay đổi tiêu điểm trên nút, nhưng nó gần với những gì bạn muốn tôi nghĩ.

Một lựa chọn khác, nếu điều đó không làm việc, là để lặp qua các điều khiển khi nút được click và xác nhận chúng bằng tay cùng một lúc ...

Đây là liên kết MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation.aspx

1

Chỉ cần giữ cập nhật này là João Angelo cho biết Form.ValidateChildren() sẽ không kích hoạt xác thực các điều khiển bên trong, hãy nói một GroupBox hoặc TabControl.

Tuy nhiên, bạn có thể vượt qua ValidationContraints đến quá tải ValidateChildren(ValidationConstraints) phương pháp và đặt nó là None đó: "Xác nhận tất cả các điều khiển con, và tất cả các trẻ em trong số này điều khiển con, dù cài đặt tài sản của họ"

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