6

WindowsフォームのDateTimePickerコントロールで非常に特殊なバグに遭遇しました。コントロールには、カスタム形式(MM-YYYY-> 2010年1月)(クレジットカードの月/年)があります。今日は9月29日です。ユーザーがコントロールを選択し、キーボードを使用して月を2月に設定すると、コントロールはArgumentOutOfRangeExceptionをスローします。2009年2月29日などの日付はありません。これは31日の日にも発生し、30日しかない月に移行します。

日を「01」に設定することでこれを処理するのは簡単ですが、ユーザーはカレンダーをクリックして手動で30日を選択し、キーボードを使用して2月を選択できます。

入力が実際にはコードではなくGUIで行われている場合、この例外をどのようにキャッチできますか?TextChangedイベントでそれをキャッチしようとしましたが、それはすでに手遅れです。例外はすでにスローされています。

このケースを処理する方法はありますか?コントロールが自動的にその月の最高値に日を変更するといいでしょう。または、少なくともイベントを介して例外を渡した場合。

(KeyPressedイベントをトラップして、その日を毎回01に設定できることは承知していますが、これは「ハッキー」な感じがします)。

4

3 に答える 3

5

月と年だけが必要な場合は、そもそもDatePickerを使用するべきではないように思われます...ユーザーが使用すべきでない月の日を含むコントロールをユーザーに提示するのはなぜですかそれ?

1つは年用、もう1つは月用の2つのドロップダウンを使用することをお勧めします。これは、ほぼすべてのオンライン支払いページのユーザーに馴染みがあり、問題を回避します。

編集:さて、例外の処理に関する特定の質問に答えるために、Application.ThreadExceptionイベントを使用できますが、可能であればそうする必要はないようにしています。

于 2009-09-29T06:38:43.140 に答える
1

DateTimePickerのShowUpDownプロパティをtrueに設定して、コントロールがカレンダーのドロップダウンではなくスピナーになるようにできますか?

于 2009-09-29T06:33:00.157 に答える
0

日なしで月/年しか入力できない方法はありません。日が明示的に指定されていない場合は、現在の日が使用されます。DateTimePickerにはすべてのデータが必要です。マスクの後ろに隠してもかまいません。

DateTimePickerにこれを行わせる唯一の方法は、典型的な.NETの答えDateTimePickerであり、日なしで入力を処理するカスタムの方法から派生し、それを持つ独自のクラスを作成することです。とにかく、あなたは日を設定せずに逃げることはありません...

可能であれば:MaskedTextBoxマスクを「00/0000」(クレジットカード形式)に設定してから、入力の検証を行うことをお勧めします。

于 2009-09-29T07:47:42.080 に答える