管理2对DateTimePicker(From和To)的最佳方法是什么?

时间:2013-04-03 03:35:53

标签: c# winforms .net-4.0 datetimepicker

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

  1. From Pickers MaxDates永远不会超过To Pickers MaxDates
  2. 如果To采摘者选择日(ToDatePicker)是当天,那么他们的MaxDates都必须是DateTime.Now.AddHours(1)。通过这种方式,用户可以搜索“当前”小时...例如:如果它当前是4/2/13 10:18 PM,那么To Picker对的MaxDate需要是4/2/13 11:00 PM ,因此用户可以将选择器对的值设置为4/2/13 10 PM,并将选择器对设置为4/2/13 11 PM,允许他们搜索晚上10点的18分钟。
  3. 我确定更多,但我已经筋疲力尽......我想你们都明白了。我试图用一些棘手的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。如果您需要更多,请告诉我

2 个答案:

答案 0 :(得分:0)

  

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

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

    DateTime now = 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;带有值的错误消息的行无效。值应介于MinDate和MaxDate之间,

This may resolve the problem

答案 1 :(得分:0)

所以我通过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选择器的“后面”。)

现在回过头来看,让对方中的每个选择器“共享”一个ValueChanged事件并以这种方式处理它可能会更容易,但我很高兴我能让它发挥作用。

<强>更新 我必须为MasterMaxDate实现INotifyPropertyChanged,以便将其新值报告给DateTimePickers。在this示例中使用了已接受的答案