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

标签 c# exception event-handling datetimepicker

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

由于您从不使用 dattime 选择器的日期值,您可以将其设置为 1,这将始终提供现有日期。

这个解决方案不知何故让我有一种不好的感觉,因为您使用的日期与您从控件中获得的日期不同——IMO,这总是可能的错误来源。请记住在您的代码中添加注释,解释您这样做的原因 ;-)

关于c# - 如何使日期时间选择器始终包含月份的最后一天,同时仅显示月份和年份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702476/

相关文章:

c# - 将一个 c# 项目构建成两个具有不同程序集名称和 guid 的相同 dll

php - PHP 中的异常消息

c# - 如何为另一个对象注销另一个对象的事件处理程序?

Flash AS3 EventDispatcher-以任何方式获取已注册监听器的列表?

javascript - 为什么在事件处理程序函数外部定义的函数需要保存在事件处理程序内部的新变量中?

c# - 使用 SyndicationFeed 读取 SyndicationItem 中的非标准元素

C# 和 MongoDB 使用 ObjectId 列表删除记录

c# - Linq 选择列表中存在的对象(A,B,C)

Java - 如果发生异常,连接/流是否已经关闭以及如何正确处理?

java - 我应该在模型中使用 HttpStatus 抛出异常吗?