c# - DateTimePicker UpDown 溢出
问题描述
我在 C# 表单上添加了 DateTimePicker。我将格式Time
与ShowUpDown = true
. 当我使用向上/向下按钮时,小时、分钟或秒会增加/减少。当秒溢出时(从 59 到 0 或 0 到 59,我想增加分钟。有没有办法呢?
现在如何运作:
- TimerPicker = 00:01:59 → 第二次按下 UpKey → TimerPicker = 00:01:00
- TimerPicker = 05:00:38 → 按 DownKey on minute → TimerPicker = 05:59:38
我希望它如何工作:
- TimerPicker = 00:01:59 → 第二次按下 UpKey → TimerPicker = 00:02:00
- TimerPicker = 05:00:38 → 按 DownKey on minute → TimerPicker = 04:59:38
编辑:这是我与 DateTimePicker 相关的代码:
DataGraph.Designer.cs:
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);
数据图.cs:
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);
}
解决方案
您必须处理向上/向下键并单击向上/向下箭头。然后将旧时间与新时间进行比较并添加小时或分钟。
如果您的日期时间超出范围(最小/最大日期时间),可能会出现问题
不是最好的解决方案,但它有效。
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;
}
}
推荐阅读
- for-loop - 如何在 For 循环中使用日期
- groovy - 如何在“ExecuteGroovyScript”处理器中使用“DBCPConnectionPoolLookup”?
- validation - 如何在spring控制器中将地图验证为@RequestParam
- ios - swift:UIImageView 上的手势识别器不起作用
- react-native - 在 iOS 上的 react-native-material-dropdown 中编辑下划线颜色而不更改箭头和标签颜色
- xcode - Slather 命令执行失败。Xcode、詹金斯、Sonar qube
- powershell - 通过 PowerShell 在远程计算机上设置环境变量
- mysql - 仅用 1 列计算 sql 中员工的总工作时间
- python - How do you take a user's signature in tkinter python
- python - 如何根据云数据流python sdk中的列值拆分csv文件