代码之家  ›  专栏  ›  技术社区  ›  Josh Smeaton

如何处理windows窗体日期时间选择器ArgumentOutOfRangeException?

  •  7
  • Josh Smeaton  · 技术社区  · 16 年前

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

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

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

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

    3 回复  |  直到 16 年前
        1
  •  5
  •   Jon Skeet    16 年前

    如果你只想要月份和年份,在我看来,你一开始就不应该使用DatePicker。..为什么要向用户显示一个控件,其中包括他们不应该使用的月份的哪一天?

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

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

        2
  •  1
  •   Matt Hamilton    16 年前

    ShowUpDown 属性设置为true,使控件变为微调器而不是日历下拉列表?

        3
  •  0
  •   Ezekiel Rage    16 年前

    您不能只输入月份/年份而不输入日期。如果没有明确指定日期,则使用当前日期。DateTimePicker需要所有数据——即使你把它藏在掩码后面也没关系。

    使DateTimePicker执行此操作的唯一方法是, 典型的。NET答案 ,编写自己的类,该类从 DateTimePicker 并且具有无需几天即可处理输入的自定义方式。 不管怎样,不定日子你是逃不掉的。..

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

    推荐文章