管理2对DateTimePickers (From和to)的最佳方式

本文关键字:to 最佳 方式 From DateTimePickers 管理 | 更新日期: 2023-09-27 18:07:05

使用日期时间选择器有很多挫折…首先,让我解释一下我的设置。我有2对DateTimePickers。1为From Date(格式为MM/dd/yyyy),对应的pair为From Hour(格式为HH且ShowUpDown = true)。另一对是相同的,除了它的日期和时间。他们需要遵守一些规则。

  1. From pickers MaxDates永远不能超过To pickers MaxDates
  2. 如果To pickers选择的日期(ToDatePicker)是当前日期,那么它们的MaxDates都需要是DateTime.Now.AddHours(1)。这样,用户就可以搜索"当前"小时了……例如:如果当前时间为4/2/13 10:18 PM,则To拾取器对的MaxDate需要为4/2/13 11:00 PM,因此用户可以将From拾取器对的Value设置为4/2/13 10 PM和To拾取器对设置为4/2/13 11 PM,允许他们搜索10 PM的18分钟。

我肯定还有更多,但是我累坏了…我想你们都明白了。我试着用一些棘手的数据绑定来完成这个任务,比如:

在构造函数

:

FromDatePicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "MaxDate"));
ToDatePicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "MaxDate"));
FromHourPicker.DataBindings.Add(new Binding("Value", FromDatePicker, "Value"));
ToHourPicker.DataBindings.Add(new Binding("Value", ToDatePicker, "Value"));
DateTime dt = DateTime.Now.Subtract(new Timespan(0, 0, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond));
DateTime plusOne = dt.AddHours(1);
FromDatePicker.MaxDate = dt;
FromHourPicker.MaxDate = dt;
ToDatePicker.MaxDate = plusOne;
ToHourPicker.MaxDate = plusOne;

In MainForm Load Event

FromDatePicker.Value = FromDatePicker.MaxDate;
FromHourPicker.Value = FromDatePicker.MaxDate;
ToDatePicker.Value = ToDatePicker.MaxDate;
ToHourPicker.Value = ToHourPicker.MaxDate;

有了这个设置,它实际上在FromDatePicker.Value = FromDatePicker.MaxDate;行失败了,Value of <current day & hour> is not valid. Value should be between MinDate and MaxDate的错误信息,除了当我把鼠标放在FromDatePicker上时,它说MaxDate是相同的<current day & hour> ....

我非常困惑,并且愿意改进我得到的东西,或者如果你们能想出一个更简单的方法来达到同样的效果,我显然也很想听到这些建议:p。

管理2对DateTimePickers (From和to)的最佳方式

DateTime dt = DateTime. now。减去(new Timespan(0,0, DateTime.Now)。分钟,DateTime.Now。第二,DateTime.Now.Millisecond));

DateTime.Now的每次召唤都可能是不同的值。时间在流逝。您需要这样做:

<>之前DateTime now = DateTime. now;DateTime dt =现在。现在减去new Timespan(0,0)。分钟,现在。第二,now.Millisecond));之前

接下来,忘记所有这些废话,使用Date属性。

DateTime dt = now.Date;   // time component is set to 00:00:00
DateTime plusOne = now.AddHours(1);

使用该设置,它实际上在 FromDatePicker上失败。Value = FromDatePicker.MaxDate;的错误信息是无效的。值应该在MinDate和MaxDate之间,

这可以解决问题

所以我通过eXtreme DataBinding实现了我想要的哈哈…它看起来很恶心,但很好用!

首先,我在Form中创建了一个名为MasterMaxDate的属性,它将始终是Now + 1小时,如问题声明中所述。

public DateTime MasterMaxDate { get; set; }

然后,我将ToDate选择器对的MaxDate属性绑定到MasterMaxDate:

ToDatePicker.DataBindings.Add(new Binding("MaxDate", this, "MasterMaxDate"));
ToHourPicker.DataBindings.Add(new Binding("MaxDate", this, "MasterMaxDate"));

接下来,我将FromDate选择器对的MaxDate属性绑定到ToHour选择器的Value属性(因为ToHour选择器是最准确的)。这确保FromDate永远不会> ToDate。

FromDatePicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "Value"));
FromHourPicker.DataBindings.Add(new Binding("MaxDate", ToHourPicker, "Value"));

接下来,(现在是奇怪的部分),我必须将一对值中的每个拾取器绑定到另一个中,以确保它们始终同步:

FromDatePicker.DataBindings.Add(new Binding("Value", FromHourPicker, "Value"));
FromHourPicker.DataBindings.Add(new Binding("Value", FromDatePicker, "Value"));
ToDatePicker.DataBindings.Add(new Binding("Value", ToHourPicker, "Value"));
ToHourPicker.DataBindings.Add(new Binding("Value", ToDatePicker, "Value"));
最后,设置MasterMaxDate:
DateTime now = DateTime.Now;
DateTime dt = DateTime.Now.Subtract(new TimeSpan(0, 0, now.Minute, now.Second, now.Millisecond));
MasterMaxDate = dt.AddHours(1);

它有效!它所有的更新和保持同步!(例如:如果我将ToDate选择器更改为FromDate选择器之前的日期,FromDate选择器也会自动更改以保持"落后于"ToDate选择器。)

现在回想起来,如果让pair中的每个拾取器"共享"一个valuechange事件并以这种方式处理它,可能会更容易,但我很高兴我让这个工作。

我必须为MasterMaxDate实现INotifyPropertyChanged,以便它将其新值报告给DateTimePickers。