【问题标题】:Winforms DatetimePicker when switching months using Arrow selects 1st day of every month使用箭头切换月份时 Winforms DatetimePicker 选择每个月的第一天
【发布时间】:2018-04-06 03:59:56
【问题描述】:

默认情况下,当我使用左右箭头在日期时间选择器中切换月份时,它会选择每个月的第一天。

我不希望这种情况发生在我的情况下。我想要相同的日期(在日期时间选择器打开之前选择的日期),除非用户选择任何其他日期。

【问题讨论】:

  • 那么你的意思是如果你今天打开日期时间选择器,选择了4月5日,那么你点击右箭头变成了5月,你想选择5月5日吗?
  • 当用户选择了 1 月 31 日并按下右箭头键时,它将如何工作?应该到2月28日吗?我敢打赌,选择器设计者将它设置为 1 以避免这种情况。
  • screencast.com/t/XHF3Pq3U 请参阅截屏视频。 4 月 5 日是我日历打开前的开始日期。后来当我切换月份时,日期更改为 May1st 和 June 1st ..... 我希望在月份之间切换时日期为 4 月 5 日。只有当用户单击任何其他日期时,日期才会更改。
  • 所以你想要一个 MonthPicker,而不是 DatePicker。这是一个 ComboBox 或 DomainUpDown。

标签: c# winforms datetimepicker


【解决方案1】:

这是设计行为。

在 WinForms 中

System.Windows.Forms.DateTimePicker 依赖于 Win32 API 组件。这意味着大部分控件再现和交互代码都是本机代码,无法在 .NET 中轻松更改。

您可以尝试 something like this,继承 DateTimePicker 并覆盖 WndProc 处理程序,这样您就可以编写自己的 WmDateTimeChange 函数 (original here) 实现并将 value 的日期强制为当您检测到一个月的跳跃时,与validTime 同一天。此类修改可能会在未来的 Windows 版本中出现问题,因此不鼓励用于学习和实验以外的任何事情。

在 WPF 中

DatePicker 使用Calendar 控件来表示其弹出窗口。 当我们查看参考源时,当从月份视图调用操作 OnNextClickOnPreviousClick 时会发生什么,我们可以看到 DiscardDayTime 函数 is calledswitch to 目标月份的第一个月:

return new DateTime(d.Year, d.Month, 1, 0, 0, 0);

我会建议子类化该控件并使用代码覆盖这些事件处理程序以保留日期,并处理目标月份的天数少于当前月份的情况,但我担心 Calendar 实例DatePicker 实现使用的用户代码无法访问。据我所知,DatePicker 也没有公开这些内部事件。

【讨论】:

  • 您指的是 wpf 源,而问题是针对 winforms。
  • 不过,嵌入 WPF 组件可能比修改 Win32 API 控件更容易、更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2020-10-02
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多