C# 如何控制DateTimePicker中的时间间隔
我在指定的表单上有一个日期时间选择器控件,如下所示:C# 如何控制DateTimePicker中的时间间隔,c#,winforms,datetimepicker,C#,Winforms,Datetimepicker,我在指定的表单上有一个日期时间选择器控件,如下所示: dtpEntry.Format = DateTimePickerFormat.Custom; dtpEntry.CustomFormat = "dd/MM/yyyy hh:mm:ss"; dtpEntry.ShowUpDown = true; 我希望用户只能以5分钟为增量增加或减少时间 有没有关于如何实现这一点的建议?问题在于,上/下控件会自动增加或减少日期/时间选择器当前突出显示的部分(即年/月/日/小时/等) 您最好在日期/时间选择器旁
dtpEntry.Format = DateTimePickerFormat.Custom;
dtpEntry.CustomFormat = "dd/MM/yyyy hh:mm:ss";
dtpEntry.ShowUpDown = true;
我希望用户只能以5分钟为增量增加或减少时间
有没有关于如何实现这一点的建议?问题在于,上/下控件会自动增加或减少日期/时间选择器当前突出显示的部分(即年/月/日/小时/等)
您最好在日期/时间选择器旁边添加自己的上/下控件(可能是一个非常小的vscrollbar),并将其连接到距离日期/时间选择器值五分钟的递增/递减间隔。可以通过观察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;
}
}
公共部分类表单1:表单{
公共表格1(){
初始化组件();
dateTimePicker1.CustomFormat=“dd/MM/yyyy hh:MM”;
dateTimePicker1.Format=DateTimePickerPerformat.Custom;
dateTimePicker1.ShowUpDown=true;
dateTimePicker1.Value=DateTime.Now.Date.AddHours(DateTime.Now.Hour);
mPrevDate=dateTimePicker1.Value;
dateTimePicker1.ValueChanged+=新事件处理程序(dateTimePicker1\u ValueChanged);
}
私有日期时间mPrevDate;
私人厕所;
私有无效dateTimePicker1\u值已更改(对象发送方,事件参数e){
如果(!mBusy){
mBusy=true;
DateTime dt=dateTimePicker1.Value;
如果((dt分*60+dt秒)%300!=0){
TimeSpan diff=dt—mPrevDate;
如果(diff.Ticks<0)dateTimePicker1.Value=mPrevDate.AddMinutes(-5);
else dateTimePicker1.Value=mPrevDate.AddMinutes(5);
}
mBusy=假;
}
mPrevDate=dateTimePicker1.Value;
}
}
我知道这是一篇老文章,但我根据上面的答案为这个问题创建了一个更好的解决方案
在课堂上
private DateTime prevTimePicker1;
private bool navigatingDateTimePicker = false;
private DateTime prevTimePicker1;
private bool navigatingDateTimePicker = false;
在构造函数中
prevTimePicker1 = dateTimePickerStart.Value;
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;
}
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;
}
您可以添加此代码
int minuteDiff = dtpJamAppointmentDokter.Value.Minute - prevTimePicker1.Minute;
if (minuteDiff == 59)
{
dtpJamAppointmentDokter.Value = dtpJamAppointmentDokter.Value.AddHours(-1);
}
以前
TimeSpan tempTS = dtpJamAppointmentDokter.Value - dtpJamAppointmentDokter.Value.Date;
我对SixOThree的答案做了一些修改,以消除Necromporph发现的bug。 应该是这样的: 在课堂上
private DateTime prevTimePicker1;
private bool navigatingDateTimePicker = false;
private DateTime prevTimePicker1;
private bool navigatingDateTimePicker = false;
在构造函数中
prevTimePicker1 = dateTimePickerStart.Value;
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;
}
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;
}
或者干脆试试这个:
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);
}
我喜欢你的答案,但是我试着使用它,它在上升时非常有效,上升就像一个符咒。但是如果你一到“00”就往下走,它就会开始让时间变长。当我们说话的时候,我试图找出原因。一旦这一个bug被修复,我相信这将是一个非常棒的功能。它工作得非常好,我所需要做的就是调整
AddMinutes()
中针对我的情况的值,它实际上就是即插即用。