对DateTimePickers感到很沮丧......首先,让我解释一下我的设置。我有2对DateTimePickers。 1是From Date(格式化MM / dd / yyyy),其对是From Hour(格式化HH和ShowUpDown = true)。除了To Date和To Hour之外,另一对是相同的。他们需要遵守一些规则。
我确定更多,但我已经筋疲力尽......我想你们都明白了。我试图用一些棘手的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。如果您需要更多,请告诉我
答案 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之间,
答案 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示例中使用了已接受的答案