【问题标题】:How to contol the time interval in a DateTimePicker如何控制 DateTimePicker 中的时间间隔
【发布时间】:2009-12-04 10:18:28
【问题描述】:

我在这样指定的表单上有一个 DateTimePicker 控件:

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

我希望用户只能以 5 分钟为增量增加或减少时间。

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

【问题讨论】:

    标签: c# winforms datetimepicker


    【解决方案1】:

    可以通过观察 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;
        }
    }
    

    【讨论】:

    • 这很好用,我需要做的就是为我的情况调整AddMinutes() 中的值,它实际上是即插即用的。
    【解决方案2】:

    我对 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      您最好在日期/时间选择器附近添加自己的上/下控件(可能是一个非常小的 vscrollbar),并将其连接到从日期/时间选择器的值开始递增/递减五分钟间隔。

      【讨论】:

        【解决方案4】:

        或者干脆试试这个:

        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);
        }
        

        【讨论】:

          【解决方案5】:

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

          在课堂上

          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;
          }
          

          【讨论】:

          • 我喜欢你的回答 SixOThree,但我尝试使用它,它在上升时效果很好,上升就像一个魅力。但是,如果您在它到达“00”时将其降低,它就会开始使小时数增加。我试图在我们说话的时候找出原因。一旦修复了这个错误,我相信这将是一个很棒的功能。
          【解决方案6】:

          您可以添加此代码

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

          之前

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

          【讨论】:

            猜你喜欢
            • 2014-07-03
            • 1970-01-01
            • 1970-01-01
            • 2014-11-17
            • 1970-01-01
            • 2014-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多