2009-09-29 43 views
5

Tôi đã chạy vào một lỗi rất cụ thể với điều khiển DateTimePicker trong Windows Forms. Kiểm soát có định dạng tùy chỉnh (MM-YYYY -> 01/2010) - tháng/năm của thẻ tín dụng. Hôm nay là ngày 29 tháng 9. Nếu người dùng chọn điều khiển và sử dụng bàn phím để đặt tháng đến tháng 2, điều khiển sẽ ném một ArgumentOutOfRangeException. Không có ngày như ngày 29 tháng 2 năm 2009. Điều này cũng sẽ xảy ra vào những ngày là ngày 31, di chuyển đến một tháng chỉ với 30 ngày. Bạn có thể dễ dàng xử lý việc này bằng cách đặt ngày thành '01', tuy nhiên người dùng có thể nhấp vào lịch để chọn theo cách thủ công vào ngày 30 và sau đó sử dụng bàn phím để chọn Tháng Hai.Làm cách nào tôi có thể xử lý cửa sổ biểu mẫu datetimepicker ArgumentOutOfRangeException?

Làm cách nào để ngoại lệ này có thể bị bắt, khi đầu vào xảy ra trên GUI và không thực sự trong mã? Chúng tôi đã cố gắng nắm bắt nó trong sự kiện TextChanged, nhưng điều đó đã quá muộn. Ngoại lệ đã được ném.

Có cách nào để xử lý trường hợp này không? Sẽ tốt hơn nếu điều khiển tự động thay đổi ngày thành giá trị cao nhất trong tháng đó. Hoặc ít nhất là nếu nó vượt qua ngoại lệ thông qua một sự kiện.

(Tôi biết rằng chúng tôi có thể bẫy sự kiện KeyPressed và đặt ngày thành 01 lần, nhưng điều này cảm thấy 'hacky').

Trả lời

5

Nếu bạn chỉ muốn tháng và năm, có vẻ như với tôi rằng bạn không nên sử dụng DatePicker ở nơi đầu tiên ... tại sao người dùng có quyền kiểm soát bao gồm ngày của tháng khi họ nên không sử dụng nó?

Tôi khuyên bạn nên sử dụng hai menu thả xuống, một cho năm và một cho tháng đó. Điều đó sẽ quen thuộc với người dùng từ mọi trang thanh toán trực tuyến và sẽ tránh được sự cố.

EDIT: OK, để trả lời câu hỏi cụ thể về xử lý ngoại lệ, bạn có thể sử dụng sự kiện Application.ThreadException, nhưng tôi cố gắng tránh phải làm như vậy nếu bạn có thể.

+0

Tôi chỉ kiểm tra nếu nó xảy ra khi ngày được hiển thị cho người dùng, và nó không. Vì vậy, bạn nói đúng, IS kiểm soát sai được sử dụng. Nhưng mục đích của tôi khi đặt câu hỏi là tìm hiểu xem liệu có thể xử lý các ngoại lệ xảy ra theo những cách tương tự không? Nếu một ngoại lệ được tạo ra từ tương tác UI của một điều khiển. –

1

Bạn có thể đặt thuộc tính ShowUpDown của DateTimePicker thành true để điều khiển trở thành spinner thay vì menu thả xuống lịch không?

+0

Điều này tất nhiên có nghĩa là bạn vẫn phải đặt ngày thành 1 trước khi hiển thị cho người dùng. –

0

Không có cách nào mà bạn chỉ có thể nhập tháng/năm không có ngày. Nếu không có ngày nào được chỉ định rõ ràng thì ngày hiện tại được sử dụng. DateTimePicker cần tất cả dữ liệu - nó không quan trọng nếu bạn ẩn nó sau mặt nạ.

Cách duy nhất để đặt DateTimePicker là, Câu trả lời .NET điển hình, để viết lớp của riêng bạn xuất phát từ DateTimePicker và có cách xử lý đầu vào tùy chỉnh mà không cần ngày. Nhưng dù sao, bạn sẽ không lấy đi mà không thiết lập ngày ...

Nếu tôi có thể: Tôi đề nghị một MaskedTextBox với một mặt nạ thiết lập để '00/0000' (định dạng thẻ tín dụng) và sau đó là một xác nhận của đầu vào.

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