使用DateTimePicker CustomFormat MMM-yyyy时避免不可表示的DateTime

时间:2013-10-03 12:26:45

标签: winforms datetimepicker

假设我有一个 DateTimePicker ,其MMM-yyyy的CustomFormat已初始化为2013年10月31日,将显示为2013年10月。

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

据推测,它正在改变月份而不改变一天,9月和11月只有30天。请注意,如果CustomFormat为dd-MMM-yyyy,则不会引发任何错误,因为该日期会自动更改为30日。

如何避免或发现此错误?

我可以添加代码以确保DateTimePicker始终初始化为一个月的第一天,但​​我想允许用户从日历下拉列表中选择月份和日期,因此我需要应对用户已手动选择了31,然后尝试使用键盘更改月份。

2 个答案:

答案 0 :(得分:5)

将其初始化为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);
    }

答案 1 :(得分:0)

是的,我知道OP已经发布并接受了答案。但是,当我尝试这个解决方案时,它不适合我。

好的,我们举一个例子:如果我将DateTimePicker的日期格式设置为MM/yyyy,我正在尝试从09到{{1}选择月份按向下箭头键然后,它将抛出异常并将我带到10文件。

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