如何处理Windows窗体datetimepicker ArgumentOutOfRangeException?

时间:2009-09-29 06:27:53

标签: .net winforms exception datetimepicker

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

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

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

有没有办法处理这种情况?如果控件自动将当天更改为该月的最高值,那将是很好的。或者至少它是否通过事件传递了异常。

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

3 个答案:

答案 0 :(得分:5)

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

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

编辑:好的,要回答处理异常的具体问题,您可以使用Application.ThreadException事件,但如果可以,我会尽量避免这样做。

答案 1 :(得分:1)

您可以将DateTimePicker的ShowUpDown属性设置为true,以便控件成为微调器而不是日历下拉列表吗?

答案 2 :(得分:0)

没有办法只能在没有这一天的情况下输入月/年。如果未明确指定日期,则使用当天。 DateTimePicker需要所有数据 - 如果你将它隐藏在掩码后面并不重要。

使DateTimePicker执行此操作的唯一方法是,典型的.NET回答,编写自己的类,该类派生自DateTimePicker,并且具有自定义方式来处理输入而无需几天。 无论如何,如果没有设定这一天你就不会离开...

如果可以:我建议将MaskedTextBox的掩码设置为'00/0000'(信用卡格式),然后验证输入。