C# 管理2对DateTimePicker(从和到)的最佳方法?
对约会时间采集器有很多不满。。。首先,让我解释一下我的设置。我有两对日期计时器。1是从日期开始的(格式为MM/dd/yyyy),其对是从小时开始的(格式为HH且ShowUpDown=true)。另一对是相同的,除了它的截止日期和截止时间。他们需要遵守几条规则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)。这样,用
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内容吗?有些人(喜欢)没有留下任何评论的否决票,通常是无缘无故的。我不想这么说:但你必须接受它。