如何在 C# Windows 窗体日期时间选取器中将向上/向下控件控制为仅几分钟
本文关键字:控制 控件 几分钟 分钟 窗体 Windows 日期 时间 选取 | 更新日期: 2023-09-27 18:36:39
我有一个 C# Windows 窗体控件,其中 DateTimePicker 设置为仅显示时间(自定义格式 h:mm),我的用户几乎总是单击向上/向下按钮来控制分钟。 但是,默认情况下,该控件会更新小时数。
如何使这些按钮默认控制分钟数?
作为奖励,当分钟超过 60 时,是否可以使小时向前/向后滚动?
Edper 的答案是正确的,一旦获得焦点,它将自动设置 datetimepicker 以更新分钟。但是,当分钟超过 60 时,小时部分不会自动前进或回滚。
您需要为此处理 KeyDown 事件。
试试这个(我结合了埃德珀的答案)。
private void Form1_Load(object sender, EventArgs e)
{
dateTimePicker1.CustomFormat = "h:mm";
dateTimePicker1.MouseWheel += new MouseEventHandler(dateTimePicker1_MouseWheel);
dateTimePicker1.KeyDown += new KeyEventHandler(dateTimePicker1_KeyDown);
dateTimePicker1.GotFocus += new EventHandler(dateTimePicker1_GotFocus);
}
void dateTimePicker1_GotFocus(object sender, EventArgs e)
{
SendKeys.Send("{right}");
}
void dateTimePicker1_MouseWheel(object sender, MouseEventArgs e)
{
if(e.Delta > 0)
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(1);
else
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(-1);
}
void dateTimePicker1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 38)
{
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(1);
e.SuppressKeyPress = true;
}
else if (e.KeyValue == 40)
{
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(-1);
e.SuppressKeyPress = true;
}
}
当datetimePicker
得到Focus
时,您将密钥发送到右侧,该密钥会自动转到分钟部分。
dateTimePicker1.GotFocus += new EventHandler(dateTimePicker1_GotFocus);
void dateTimePicker1_GotFocus(object sender, EventArgs e)
{
SendKeys.Send("{right}");
}
您需要自定义 datetimepicker.create usercontrol with datetimepicker 并处理 keydown 事件
DateTimePicker 只需切换小时和分钟中的哪一个具有焦点即可响应向右箭头键。这意味着,如果 DTP 失去焦点,然后重新获得焦点,焦点将回到数小时。您可以通过处理 DTP 然后重新实例化它来解决此问题,以便 SendKeys.Send("{right}") 始终从具有焦点的时间开始,但这可能会给您带来在哪里执行此操作的问题。
我认为这通过以下方式解决了问题:
- 将 DTP 的 "ShowUpDown" 属性设置为 false。
- 将 NumericUpDown 控件添加到窗体
- 将 NUD 的"宽度"设为 18 像素以隐藏其值框
- 小心地将 NUD 放在 DTP 的日期选择向下箭头上,使其看起来有点像 DTP 的向上/向下箭头
- 将 NUD 的"最大值"属性设置为 1,将"最小值"设置为 -1
- 双击 NUD 的"ValueChanged"事件以创建事件处理程序,并添加以下代码以使处理程序如下所示:
private bool GfChangeingNudValueByCode = false;
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
if (!GfChangeingNudValueByCode)
{
// Only do this when the user has changed the NUD's value not when this code
// changes it to zero at the end of this handler
if (numericUpDown1.Value == -1)
{
// The user has pressed the down arrow so decrement the DTP's value
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(-1);
}
if (numericUpDown1.Value == 1)
{
// The user has pressed the up arrow so increment the DTP's value
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(1);
}
// Reset the NUD's value to zero so that we can tell which arrow the user
// presses next but first set the flag to true otherwise we would get a
// stack-overflow when we set the NUD's value to zero which results in
// this event handler being re-entered and re-entered and re-entered ...
GfChangeingNudValueByCode = true;
numericUpDown1.Value = 0;
GfChangeingNudValueByCode = false;
}
}
这将产生看起来像 DTP 的 DTP/NUD 组合,用户可以通过以下方式更改时间值:
- 在小时或分钟字段中键入数字
- 按键盘上的向上、向下、向左和向右箭头以更改具有焦点的字段(小时或分钟)最重要的是
- 单击 NUD 的向上/向下箭头,全面更改时间:当分钟从 59 变为 0 或从 0 变为 59 时,小时会发生变化。
基金