2009-09-29 18 views
5

Wpadłem na bardzo specyficzny błąd z formantem DateTimePicker w Windows Forms. Formant ma niestandardowy format (MM-RRRR -> 01/2010) - miesiąc/rok karty kredytowej. Dzisiaj jest 29 września. Jeśli użytkownik wybierze formant i użyje klawiatury do ustawienia miesiąca na luty, formant wygeneruje wyjątek ArgumentOutOfRangeException. Nie ma takiej daty jak 29-luty-2009. To samo stanie się w dniach jako 31., przechodząc do miesiąca z zaledwie 30 dniami.Jak obsługiwać formularz datetimepicker okna ArgumentOutOfRangeException?

Z łatwością można sobie z tym poradzić, ustawiając dzień na "01", jednak użytkownik może kliknąć kalendarz, aby ręcznie wybrać 30., a następnie za pomocą klawiatury wybrać luty.

W jaki sposób można uchwycić ten wyjątek, gdy dane wejściowe występują w interfejsie GUI, a nie w kodzie? Próbowaliśmy złapać to w zdarzeniu TextChanged, ale jest już za późno. Wyjątek został już zgłoszony.

Czy istnieje sposób postępowania z tą sprawą? Byłoby miło, gdyby sterowanie automatycznie zmieniło dzień na najwyższą wartość dla tego miesiąca. Lub przynajmniej, jeśli przeszedł wyjątek przez zdarzenie.

(Jestem świadomy, że możemy uwięzić zdarzenie KeyPressed i ustawić dzień na 01 za każdym razem, ale to wydaje się "hacky").

Odpowiedz

5

Jeśli chcesz tylko miesiąc i rok, wydaje mi się, że nie powinieneś używać DatePicker w pierwszym rzędzie ... po co przedstawić użytkownikowi kontrolę, która obejmuje dzień miesiąca, w którym powinieneś Używasz go?

Proponuję użyć dwóch menu rozwijanych, jednego dla roku i jednego dla miesiąca. To będzie znane użytkownikom z niemal każdej strony płatności online i pozwoli uniknąć problemu.

EDYCJA: Okay, aby odpowiedzieć na konkretne pytanie dotyczące obsługi wyjątków, możesz użyć zdarzenia Application.ThreadException, ale staram się tego uniknąć, jeśli możesz.

+0

Właśnie sprawdziłem, czy zdarza się, gdy dzień jest pokazywany użytkownikowi, a tak nie jest. Więc masz rację, niewłaściwa kontrola jest w użyciu. Ale moim celem było zadać pytanie, czy można poradzić sobie z wyjątkami, które miały miejsce w podobny sposób? Jeśli wyjątek jest generowany z interakcji interfejsu użytkownika kontrolki. –

1

Czy można ustawić właściwość DateTimePicker na ShowUpDown na wartość true, aby formant stał się pokrętłem, a nie rozwijanym kalendarzem?

+0

To oczywiście oznacza, że ​​musisz jeszcze ustawić dzień na 1, zanim wyświetlisz go użytkownikowi. –

0

Nie ma możliwości, że można wprowadzić tylko miesiąc/rok bez dnia. Jeśli żaden dzień nie jest jawnie określony, używany jest bieżący dzień. DateTimePicker potrzebuje wszystkich danych - nie ma znaczenia, czy ukryjesz je za maską.

Jedynym sposobem, aby to zrobić jest DateTimePicker, typowy .NET odpowiedź, aby napisać własną klasę, która wynika z DateTimePicker i ma własny sposób postępowania wejście bez dni. W każdym razie nie uciec bez ustawiania dnia ...

Jeśli mogę: Proponuję MaskedTextBox z maską ustawioną na "00/0000" (format karty kredytowej), a następnie sprawdzanie poprawności danych wejściowych.

Powiązane problemy