6

我在 Windows 窗体中使用 DateTimePicker 控件遇到了一个非常具体的错误。该控件具有自定义格式 (MM-YYYY -> 01/2010) - 信用卡的月/年。今天是9月29日。如果用户选择该控件,并使用键盘将月份设置为二月,则该控件将引发 ArgumentOutOfRangeException。没有 2009 年 2 月 29 日这样的日期。这也将在 31 日发生,移动到只有 30 天的一个月。

通过将日期设置为“01”来处理这个问题很容易,但是用户可以单击日历手动选择 30 日,然后使用键盘选择二月。

当输入发生在 GUI 上而不是真正在代码中时,如何捕获此异常?我们试图在 TextChanged 事件中捕获它,但这已经太晚了。异常已经被抛出。

有什么办法可以处理这种情况吗?如果控件自动将日期更改为该月的最高值,那就太好了。或者至少如果它通过事件传递了异常。

(我知道我们可以捕获 KeyPressed 事件并每次都将日期设置为 01,但这感觉很“hacky”)。

4

3 回答 3

5

如果你只想要月份和年份,在我看来你不应该首先使用 DatePicker ......为什么要向用户提供一个控件,其中包括他们不应该使用的月份中的哪一天它?

我建议您使用两个下拉菜单,一个用于年份,一个用于月份。这对于几乎每个在线支付页面的用户来说都是熟悉的,并且会避免这个问题。

编辑:好的,要回答处理异常的具体问题,您可以使用该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 回答