如何使日期时间选择器始终包含月份的最后一天,同时仅显示月份和年份



我有一个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)
}

相关内容

  • 没有找到相关文章

最新更新