3

假设我有一个自定义格式为 MMM-yyyy 的DateTimePicker,它已初始化为 2013 年 10 月 31 日的值,这将显示为 2013 年 10 月。

如果选择控件的 Oct 部分并按向上或向下箭头,则会生成ArgumentOutOfRangeException - Year、Month 和 Day 参数描述不可表示的 DateTime

想必是改月不改日,9月和11月只有30天。请注意,如果 CustomFormat 为 dd-MMM-yyyy,则不会引发错误,因为日期会自动更改为 30 日。

如何避免或捕获此错误?

我可以添加代码以确保 DateTimePicker 始终初始化为一个月的第一天,但​​我想让用户从日历下拉列表中选择月份和日期,所以我需要处理用户手动的情况选择 31 日,然后尝试使用键盘更改月份。

4

2 回答 2

6

只需将其初始化为 10 月 1 日。也不例外,还是一样的显示。

当然,您需要调整用户选择的值以使其保持在第一个位置:

    private void dateTimePicker1_ValueChanged(object sender, EventArgs e) {
        var dtp = (DateTimePicker)sender;
        dtp.Value = new DateTime(dtp.Value.Year, dtp.Value.Month, 1);
    }
于 2013-10-03T13:14:14.430 回答
0

是的,我知道答案已经发布并被 OP 接受。但是,当我尝试过这个解决方案时,它对我不起作用。

好的,让我们举个例子:如果我将日期格式设置为DateTimePickertoMM/yyyy并且我试图通过按箭头键从09to (9 月到 10 月)选择月份然后,它将抛出异常并将我带到文件中。10DownProgram.cs

解决方案与Hans Passant给出的相同,但唯一的区别是我们只需要使用PreviewKeyDownevent 而不是ValueChanged. 我不知道KeyDown事件是否也适用于此。但是,我已经用PreviewKeyDown事件对其进行了测试,并且工作正常。

于 2014-10-31T10:06:33.527 回答