C# 管理2对DateTimePicker(从和到)的最佳方法?

C# 管理2对DateTimePicker(从和到)的最佳方法?,c#,winforms,.net-4.0,datetimepicker,C#,Winforms,.net 4.0,Datetimepicker,对约会时间采集器有很多不满。。。首先,让我解释一下我的设置。我有两对日期计时器。1是从日期开始的(格式为MM/dd/yyyy),其对是从小时开始的(格式为HH且ShowUpDown=true)。另一对是相同的,除了它的截止日期和截止时间。他们需要遵守几条规则 From选择器MaxDates不能大于To选择器MaxDates 如果To Picker selected day(ToDatePicker)是当前日期,则两个MaxDate都必须是DateTime.Now.AddHours(1)。这样,用

对约会时间采集器有很多不满。。。首先,让我解释一下我的设置。我有两对日期计时器。1是从日期开始的(格式为MM/dd/yyyy),其对是从小时开始的(格式为HH且ShowUpDown=true)。另一对是相同的,除了它的截止日期和截止时间。他们需要遵守几条规则

  • From选择器MaxDates不能大于To选择器MaxDates
  • 如果To Picker selected day(ToDatePicker)是当前日期,则两个MaxDate都必须是DateTime.Now.AddHours(1)。这样,用户将能够搜索“当前”小时。。。例如:如果当前为4/2/13 10:18 PM,则To选取器对的MaxDate需要为4/2/13 11:00 PM,因此用户可以将From picker对的值设置为4/2/13 10 PM,将To picker对的值设置为4/2/13 11 PM,允许他们搜索18分钟的10 PM小时
  • 我肯定还有很多,但我已经筋疲力尽了。。。我想你会明白的。我试图通过一些棘手的数据绑定来实现这一点,如:

    在构造函数中:

    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;
    
    在主窗体加载事件中

    FromDatePicker.Value = FromDatePicker.MaxDate;
    FromHourPicker.Value = FromDatePicker.MaxDate;
    ToDatePicker.Value = ToDatePicker.MaxDate;
    ToHourPicker.Value = ToHourPicker.MaxDate;
    
    使用该设置,它实际上在
    FromDatePicker.Value=FromDatePicker.MaxDate上失败行,错误消息为
    的值无效。值应该在MinDate和MaxDate之间
    ,除非我将鼠标从DatePicker上滑过,在那一行,它显示MaxDate是相同的

    我非常困惑,并愿意改进我所得到的,或者如果你们能想出一个更简单的方法来达到同样的效果,我当然也很乐意听到这些建议:p。如果你们需要更多,请告诉我

    DateTime dt=DateTime.Now.Subtract(新的时间跨度(0,0,DateTime.Now.Minute,DateTime.Now.Second,DateTime.Now.毫秒))

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

    DateTime now = DateTime.Now; DateTime dt = now.Subtract(new Timespan(0, 0, now.Minute, now.Second, now.Millisecond)); 使用该设置,它实际上在FromDatePicker.Value=FromDatePicker.MaxDate上失败;包含值为的错误消息的行无效。值应介于MinDate和MaxDate之间


    所以我通过极限数据绑定实现了我想要的,哈哈。。。它看起来很恶心,但很管用

    首先,我以MasterMaxDate的形式创建了一个属性,该属性现在总是+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"));
    
    DateTime now = DateTime.Now;
    DateTime dt = DateTime.Now.Subtract(new TimeSpan(0, 0, now.Minute, now.Second, now.Millisecond));
    
    MasterMaxDate = dt.AddHours(1);
    
    接下来,我将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:

    ToDatePicker.DataBindings.Add(new Binding("MaxDate", this, "MasterMaxDate"));
    ToHourPicker.DataBindings.Add(new Binding("MaxDate", this, "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,以便它将其新值报告给DateTimePicker。在示例中使用了可接受的答案

    您是否尝试过类似的方法
    DateTime date=FromDatePicker.Value.date+TimePicker.Value.TimeOfDay例如。。您需要访问
    FromDatePicker.Date
    实际上,在查看它之后,您需要查看
    FromDatePicker.CustomFormat
    属性。。嗯,不,我要试一试。还有,为什么会有反对票?提供了大量的细节,问了一个确切的问题(为什么会出现异常)和一个模糊的问题,但仍然有效(有更好的方法)不确定是否有下一票我没有下一票。@DJKRAZE所以我会在构造函数初始化或加载事件中的值设置中添加+.TimeOfDay内容吗?有些人(喜欢)没有留下任何评论的否决票,通常是无缘无故的。我不想这么说:但你必须接受它。