如何控制DateTimePicker中的时间间隔

我在如此指定的表单上有一个DateTimePicker控件:

dtpEntry.Format = DateTimePickerFormat.Custom; dtpEntry.CustomFormat = "dd/MM/yyyy hh:mm:ss"; dtpEntry.ShowUpDown = true; 

我希望用户只能以5分钟的增量递增或递减时间。

关于如何实现这一目标的任何建议?

可以通过观察ValueChanged事件并覆盖该值来实现。 这个样本表格效果很好:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); dateTimePicker1.CustomFormat = "dd/MM/yyyy hh:mm"; dateTimePicker1.Format = DateTimePickerFormat.Custom; dateTimePicker1.ShowUpDown = true; dateTimePicker1.Value = DateTime.Now.Date.AddHours(DateTime.Now.Hour); mPrevDate = dateTimePicker1.Value; dateTimePicker1.ValueChanged += new EventHandler(dateTimePicker1_ValueChanged); } private DateTime mPrevDate; private bool mBusy; private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { if (!mBusy) { mBusy = true; DateTime dt = dateTimePicker1.Value; if ((dt.Minute * 60 + dt.Second) % 300 != 0) { TimeSpan diff = dt - mPrevDate; if (diff.Ticks < 0) dateTimePicker1.Value = mPrevDate.AddMinutes(-5); else dateTimePicker1.Value = mPrevDate.AddMinutes(5); } mBusy = false; } mPrevDate = dateTimePicker1.Value; } } 

我已经改变了SixOThree的答案,以消除Necromporph发现的错误。 它应该是这样的:

在课堂里

 private DateTime prevTimePicker1; private bool navigatingDateTimePicker = false; 

在构造函数中

 prevTimePicker1 = dateTimePickerStart.Value; navigatingDateTimePicker = false; 

事件

 private void dateTimePickerStart_ValueChanged(object sender, EventArgs e) { if (!navigatingDateTimePicker) { /* First set the navigating flag to true so this method doesn't get called again while updating */ navigatingDateTimePicker = true; /* using timespan because that's the only way I know how to round times well */ TimeSpan tempTS = dateTimePickerStart.Value - dateTimePickerStart.Value.Date; TimeSpan roundedTimeSpan; TimeSpan TDBug = dateTimePickerStart.Value - prevTimePicker1; if (TDBug.TotalMinutes == 59) { // first: if we are going back and skipping an hour it needs an adjustment roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Floor((tempTS.TotalMinutes - 60) / 5)); dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan; } else if (dateTimePickerStart.Value > prevTimePicker1) { // round up to the nearest interval roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Ceiling(tempTS.TotalMinutes / 5)); dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan; } else { // round down to the nearest interval from prev roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Floor(tempTS.TotalMinutes / 5)); dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan; } navigatingDateTimePicker = false; } prevTimePicker1 = dateTimePickerStart.Value; } 

问题是上/下控制自动增加或减少日期/时间选择器的当前突出显示部分(即年/月/日/小时/等)。

您可能最好在紧跟日期/时间选择器的位置添加自己的上/下控制(可能是一个非常小的vscrollbar),并将其连接起来,以便从日期/时间选择器的值增加/减少五分钟的间隔。

或者只是尝试这个:

 private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { if (this.dateTimePicker1.Value.Minute % 5 == 0) return; if (this.dateTimePicker1.Value.Minute % 5 == 1) this.dateTimePicker1.Value = this.dateTimePicker1.Value.AddMinutes(4); if (this.dateTimePicker1.Value.Minute % 5 == 4) this.dateTimePicker1.Value = this.dateTimePicker1.Value.AddMinutes(-4); } 

我知道这是一篇旧文章,但我根据上面的答案为这个问题创建了一个更好的解决方案。

在课堂里

 private DateTime prevTimePicker1; private bool navigatingDateTimePicker = false; 

在构造函数中

 prevTimePicker1 = dateTimePickerStart.Value; navigatingDateTimePicker = false; 

事件

 private void dateTimePickerStart_ValueChanged(object sender, EventArgs e) { if (!navigatingDateTimePicker) { /* First set the navigating flag to true so this method doesn't get called again while updating */ navigatingDateTimePicker = true; /* using timespan because that's the only way I know how to round times well */ TimeSpan tempTS = dateTimePickerStart.Value - dateTimePickerStart.Value.Date; TimeSpan roundedTimeSpan; if (dateTimePickerStart.Value > prevTimePicker1) { // round up to the nearest interval roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Ceiling(tempTS.TotalMinutes / 5)); dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan; } else { // round down to the nearest interval from prev roundedTimeSpan = TimeSpan.FromMinutes(5 * Math.Floor(tempTS.TotalMinutes / 5)); dateTimePickerStart.Value = dateTimePickerStart.Value.Date + roundedTimeSpan; } navigatingDateTimePicker = false; } prevTimePicker1 = dateTimePickerStart.Value; } 

你可以添加这段代码

 int minuteDiff = dtpJamAppointmentDokter.Value.Minute - prevTimePicker1.Minute; if (minuteDiff == 59) { dtpJamAppointmentDokter.Value = dtpJamAppointmentDokter.Value.AddHours(-1); } 

之前

 TimeSpan tempTS = dtpJamAppointmentDokter.Value - dtpJamAppointmentDokter.Value.Date;