如何在 C# Windows 窗体日期时间选取器中将向上/向下控件控制为仅几分钟

本文关键字:控制 控件 几分钟 分钟 窗体 Windows 日期 时间 选取 | 更新日期: 2023-09-27 18:36:39

我有一个 C# Windows 窗体控件,其中 DateTimePicker 设置为仅显示时间(自定义格式 h:mm),我的用户几乎总是单击向上/向下按钮来控制分钟。 但是,默认情况下,该控件会更新小时数。

如何使这些按钮默认控制分钟数?

作为奖励,当分钟超过 60 时,是否可以使小时向前/向后滚动?

如何在 C# Windows 窗体日期时间选取器中将向上/向下控件控制为仅几分钟

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 时,小时会发生变化。

基金