2009-09-29 2 views
5

Я столкнулся с очень специфической ошибкой с элементом управления DateTimePicker в Windows Forms. Элемент управления имеет собственный формат (ММ-ГГГГ -> 01/2010) - месяц/год кредитной карты. Сегодня 29 сентября. Если пользователь выбирает элемент управления и использует клавиатуру для установки месяца до февраля, элемент управления выдаст исключение ArgumentOutOfRangeException. Нет такой даты, как 29 февраля 2009 года. Это также произойдет в дни 31-го, перейдя на месяц с 30 днями.Как я могу обрабатывать формы windows datetimepicker ArgumentOutOfRangeException?

Было бы легко справиться с этим, установив день на «01», однако пользователь может щелкнуть по календарю, чтобы вручную выбрать 30-е, а затем использовать клавиатуру для выбора февраля.

Как это исключение можно поймать, когда входные данные происходят в графическом интерфейсе, а не в коде? Мы попытались поймать его в событии TextChanged, но это уже слишком поздно. Исключение уже выбрано.

Есть ли способ обработать этот случай? Было бы неплохо, если бы элемент управления автоматически изменил день на максимальное значение за этот месяц. Или, по крайней мере, если он прошел исключение через событие.

(Я знаю, что мы могли бы захватить событие KeyPressed и установить день на 01 каждый раз, но это кажется «взломанным»).

ответ

5

Если вы хотите только месяц и год, мне кажется, что вы не должны использовать DatePicker в первую очередь ... зачем представить пользователю элемент управления, который включает в себя день месяца, когда они должны не использовать его?

Я бы предположил, что вы либо используете два выпадающих списка, один для года и один для месяца. Это будет хорошо знакомо пользователям примерно на каждой странице онлайн-платежей и позволит избежать проблемы.

EDIT: Хорошо, чтобы ответить на конкретный вопрос обработки исключений, вы можете использовать событие Application.ThreadException, но я постараюсь избежать необходимости делать это, если вы можете.

+0

Я только что проверил, если это происходит, когда день отображается пользователю, а это не так. Таким образом, вы правы, неправильный контроль используется. Но цель, которую я задавала, заключалась в том, чтобы выяснить, можно ли обрабатывать исключения, которые произошли аналогичным образом? Если исключение генерируется из взаимодействия пользовательского интерфейса элемента управления. –

1

Нельзя ли установить для свойства DateTimePicker ShowUpDown значение true, чтобы элемент управления стал поворотником, а не календарным раскрывающимся списком?

+0

Это, конечно же, означает, что вам нужно установить день до 1, прежде чем показывать его пользователю. –

0

Невозможно ввести месяц или год без ввода дня. Если ни один день не указан явно, используется текущий день. Для DateTimePicker нужны все данные - неважно, скрываете ли вы его за маской.

Единственный способ сделать DateTimePicker сделать это, типичный ответ .NET, чтобы написать свой собственный класс, производный от DateTimePicker и имеет собственный способ обработки ввода без выходных дней. Во всяком случае, вы не уйдете без установки на следующий день ...

Если я могу: я предлагаю MaskedTextBox с маской, установленной в (формат кредитной карты) '00/0000' , а затем подтверждения ввода.

 Смежные вопросы

  • Нет связанных вопросов^_^