首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTimePicker UpDown溢出

DateTimePicker UpDown溢出
EN

Stack Overflow用户
提问于 2020-03-04 13:07:55
回答 1查看 351关注 0票数 1

我在我的DateTimePicker表单中添加了C#。我使用Time格式和ShowUpDown = true。当我使用上/下按钮时,小时、分钟或秒增加/减少。当秒溢出(从59到0或0到59 )时,我想增加分钟。有办法吗?

它现在是如何运作的:

  • TimerPicker = 00:01:59→按UpKey on second→TimerPicker = 00:01:00
  • TimerPicker = 05:00:38→按DownKey on→TimerPicker = 05:59:38

我希望它能起作用:

  • TimerPicker = 00:01:59→press UpKey on second→TimerPicker =UpKey= 05:00:38→press DownKey on→TimerPicker = 04:59:38

编辑:下面是与DateTimePicker相关的代码:

DataGraph.Designer.cs:

代码语言:javascript
复制
this.TimePerDivisionPicker = new System.Windows.Forms.DateTimePicker();
// 
// TimePerDivisionPicker
// 
this.TimePerDivisionPicker.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.TimePerDivisionPicker.CustomFormat = "";
this.TimePerDivisionPicker.Format = System.Windows.Forms.DateTimePickerFormat.Time;
this.TimePerDivisionPicker.ImeMode = System.Windows.Forms.ImeMode.On;
this.TimePerDivisionPicker.Location = new System.Drawing.Point(83, 16);
this.TimePerDivisionPicker.Name = "TimePerDivisionPicker";
this.TimePerDivisionPicker.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.TimePerDivisionPicker.ShowUpDown = true;
this.TimePerDivisionPicker.Size = new System.Drawing.Size(85, 20);
this.TimePerDivisionPicker.TabIndex = 4;
this.TimePerDivisionPicker.Value = new System.DateTime(2020, 3, 2, 0, 1, 0, 0);
this.TimePerDivisionPicker.ValueChanged += new System.EventHandler(this.TimePerDivisionPicker_ValueChanged);

DataGraph.cs:

代码语言:javascript
复制
private void TimePerDivisionPicker_ValueChanged(object sender, EventArgs e)
{
    String[] temp = TimePerDivisionPicker.Text.Split(':');
    UInt16 tempHours = Convert.ToUInt16(temp[0]);
    UInt16 tempMinutes = Convert.ToUInt16(temp[1]);
    UInt16 tempSecondes = Convert.ToUInt16(temp[2]);
    TimePerDivision = Convert.ToUInt32(tempHours * 3600 + tempMinutes * 60 + tempSecondes);
}
EN

回答 1

Stack Overflow用户

发布于 2020-03-05 12:58:43

您必须处理上/下键,并单击向上/向下箭头。然后比较旧的时间和新的时间,并增加小时或分钟。

如果您的日期时间超出范围(最小/最大DateTime),可能会出现问题。

这不是最好的解决办法,但有效。

代码语言:javascript
复制
public class MyTimePicker : DateTimePicker
{
    private Arrow _pressedArrow;
    private DateTime? _oldValue;

    public MyTimePicker()
    {
        Format = DateTimePickerFormat.Time;
        ShowUpDown = true;
    }

    protected override void OnValueChanged(EventArgs eventargs)
    {
        base.OnValueChanged(eventargs);

        if (!_oldValue.HasValue)
        {
            return;
        }
        var diff = Value - _oldValue.Value;
        _oldValue = null;

        if (_pressedArrow == Arrow.Up)
        {
            if (diff.Minutes < 0)
            {
                Value = Value.AddHours(1);
            }
            else if (diff.Seconds < 0)
            {
                Value = Value.AddMinutes(1);
            }
        }
        else if (_pressedArrow == Arrow.Down)
        {
            if (diff.Minutes > 0)
            {
                Value = Value.AddHours(-1);
            }
            else if (diff.Seconds > 0)
            {
                Value = Value.AddMinutes(-1);
            }
        }
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        switch (keyData)
        {
            case Keys.Up: HandleArrow(Arrow.Up); break;
            case Keys.Down: HandleArrow(Arrow.Down); break;
            default: break;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x204e || m.Msg == 0x4e)
        {
            NMHDR nfy = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
            if (nfy.code == -722)
            {
                NMUPDOWN ud = (NMUPDOWN)Marshal.PtrToStructure(m.LParam, typeof(NMUPDOWN));
                HandleArrow(ud.delta < 0 ? Arrow.Down : Arrow.Up);
            }
        }
        base.WndProc(ref m);
    }

    private bool HandleArrow(Arrow arrow)
    {
        _pressedArrow = arrow;
        _oldValue = Value;
        return false;
    }

    private enum Arrow
    {
        Up,
        Down,
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct NMHDR
    {
        public IntPtr hwndFrom;
        public IntPtr idFrom;
        public int code;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct NMUPDOWN
    {
        public NMHDR hdr;
        public int pos;
        public int delta;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60526833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档