2009-09-29 57 views
5

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

将日期设置为'01'可以很容易地处理此问题,但用户可以单击日历以手动选择第30个,然后使用键盘选择2月。

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

有没有办法处理这种情况?如果控件自动将该日更改为当月的最高值,那将会很好。或者至少如果它通过一个事件通过例外。

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

回答

5

如果你只想要月份和年份,在我看来,你不应该在第一个地方使用DatePicker ...为什么向用户提供一个控件,该控件包括当月的那一天,当他们不应该不会使用它?

我建议你使用两个下拉菜单,一个为一年,一个为本月。从几乎所有的在线支付页面,用户都会很熟悉,并且可以避免这个问题。

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

+0

我刚刚测试过是否会在向用户显示日期时发生,而不是。所以你是对的,正在使用错误的控制。但是,我问这个问题的目的是要找出是否有可能处理以类似方式发生的异常?如果从控件的UI交互中生成异常。 – 2009-09-29 06:49:24

1

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

+0

这当然意味着您必须在将日期显示给用户之前将其设置为1。 – 2009-09-29 06:33:43

0

没有办法,你只能输入月/年没有一天。如果没有明确指定当天,则使用当天。 DateTimePicker需要所有数据 - 如果将其隐藏在掩码后面,则无关紧要。

做出的DateTimePicker的唯一办法做到这一点,典型的.NET答案,写自己的类,从DateTimePicker派生并具有处理输入而不天的自定义方式。 无论如何,你不会设置一天...

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