0

对 DateTimePickers 有很多不满...首先,让我解释一下我的设置。我有 2 对 DateTimePickers。1 是 From Date(格式为 MM/dd/yyyy),其对是 From Hour(格式为 HH 和 ShowUpDown = true)。另一对除了 To Date 和 To Hour 之外是相同的。他们需要遵守一些规则。

  1. From 选择器 MaxDates 永远不会超过 To 选择器 MaxDates
  2. 如果 To pickers selected day (ToDatePicker) 是当前日期,则它们的 MaxDates 都需要为 DateTime.Now.AddHours(1)。这样,用户将能够搜索“当前”时间...例如:如果当前是 13 年 4 月 2 日晚上 10:18,则 To 选择器对的 MaxDate 需要是 13 年 4 月 2 日晚上 11:00 ,因此用户可以将 From picker pair 的 Value 设置为 4/2/13 10 PM 和 To picker pair 设置为 4/2/13 11 PM,允许他们搜索晚上 10 点的 18 分钟。

我确定还有更多,但我已经筋疲力尽了……我想你们明白了。我尝试使用一些棘手的 DataBindings 来完成此操作,例如:

在构造函数中:

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;

在 MainForm 加载事件中

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。让我知道您是否需要更多

4

2 回答 2

0

DateTime dt = DateTime.Now.Subtract(new Timespan(0, 0, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond));

DateTime.Now潜在的每一次唤起都是不同的价值。时间在前进。你需要这样做:

    现在日期时间 = 日期时间。现在;
    DateTime dt = now.Subtract(new Timespan(0, 0, now.Minute, now.Second, now.Millisecond));

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

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

通过该设置,它实际上在FromDatePicker.Value = FromDatePicker.MaxDate;上失败了。与 Value of is not valid 的错误信息一致。值应介于 MinDate 和 MaxDate 之间,

这可能会解决问题

于 2013-04-03T04:49:11.843 回答
0

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

首先,我在名为 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"));

接下来,(现在是奇怪的部分),我必须将一对 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 选择器的“后面”。)

现在回想起来,让这对中的每个选择器“共享”一个 ValueChanged 事件并以这种方式处理它可能会更容易,但我很高兴我能做到这一点。

更新 我必须为 MasterMaxDate 实现 INotifyPropertyChanged,以便它将其新值报告给 DateTimePickers。在这个例子中使用了接受的答案

于 2013-04-03T14:55:22.137 回答