假设我有一个 DateTimePicker ,其MMM-yyyy的CustomFormat已初始化为2013年10月31日,将显示为2013年10月。
如果选择控件的Oct部分并按向上或向下箭头,则会生成 ArgumentOutOfRangeException - 年,月和日参数描述不可表示的DateTime
据推测,它正在改变月份而不改变一天,9月和11月只有30天。请注意,如果CustomFormat为dd-MMM-yyyy,则不会引发任何错误,因为该日期会自动更改为30日。
如何避免或发现此错误?
我可以添加代码以确保DateTimePicker始终初始化为一个月的第一天,但我想允许用户从日历下拉列表中选择月份和日期,因此我需要应对用户已手动选择了31,然后尝试使用键盘更改月份。
答案 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
事件对其进行了测试,并且工作正常。