我有一个DateTimePicker,我设置它只显示月份和年份,如下所示:
myDateTimePicker.Format = DateTimePickerFormat.Custom;
myDateTimePicker.CustomFormat = "MMMM yyyy";
myDateTimePicker.ShowUpDown = true;
但是,我希望日期的值始终是所选月份的最后一天,所以我在ValueChanged事件中使用设置DateTime
DateTime selectedDate = myDateTimePicker.Value;
DateTime lastDayOfMonth = new DateTime(
selectedDate.Year,
selectedDate.Month,
DateTime.DaysInMonth(selectedDate.Year, selectedDate.Month));
myDateTimePicker.Value = lastDayOfMonth;
问题是,如果我选择了一个像三月这样的月份,并且我使用向上/向下控制将该月份更改为二月,那么在处理ValueChanged事件之前,我会收到以下错误:
ArgumentOutOfRangeException was unhandled
Year, Month, and Day parameters describe an un-representable DateTime.
这是可以理解的,因为日期是3月31日,现在改为2月31日。然而,我想把它改为2月28日(或2月29日)。
我怎样才能做到这一点?
很奇怪,我试图重现你的问题,当我从三月切换到二月时,我的控件什么都不显示。。。也许我们有不同的框架版本,它们对相同错误的处理方式不同。
无论如何,一个解决方案是将日期时间选择器设置为每个月的第一个,当您需要该值时,您可以直接使用当前的代码:
DateTime lastDayOfMonth = new DateTime(
selectedDate.Year,
selectedDate.Month,
DateTime.DaysInMonth(selectedDate.Year, selectedDate.Month));
由于您从不使用日期选择器的日期值,因此您可以将其设置为1,这将始终提供现有日期。
这个解决方案让我有一种不好的感觉,因为你使用的日期与你从控制中得到的日期不同——IMO,这总是一个可能的错误来源。记住在你的代码中添加注释,解释你为什么这样做;-)
我可能会像Treb Selected一样使用月1号,但会扩展DateTimePicker,这样当你这样做时:
MyDateTimePicker.Value
它会做这样的事情:
get{
return value.addMonths(1).addDays(-1)
}