1

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

我怎样才能让这些按钮默认控制分钟?

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

4

4 回答 4

1

datetimePicker得到Focus然后你发送钥匙自动转到分钟部分的权利。

dateTimePicker1.GotFocus += new EventHandler(dateTimePicker1_GotFocus);

void dateTimePicker1_GotFocus(object sender, EventArgs e)
{
 SendKeys.Send("{right}");
}
于 2013-10-23T04:04:10.727 回答
1

Edper 的回答是正确的,一旦获得焦点,它会自动设置 datetimepicker 来更新分钟。但是,当分钟超过 60 时,小时部分不会自动前进或回滚。

您需要为此处理 KeyDown 事件。

试试这个(我结合了 Edper 的回答)。

    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;
        }
    }
于 2013-10-23T04:15:14.243 回答
0

您需要使用 datetimepicker 自定义 datetimepicker.create usercontrol 并处理 keydown 事件

于 2013-10-23T03:23:33.473 回答
0

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/NUD 组合看起来像 DTP,用户可以通过以下方式更改时间值:

  • 在小时或分钟字段中键入数字
  • 按键盘上的向上、向下、向左和向右箭头来更改具有焦点和最重要的任何字段(小时或分钟)
  • 单击全面更改时间的 NUD 的上/下箭头:当分钟从 59 到 0 或从 0 到 59 时,小时会发生变化。

优质教育基金

于 2020-06-09T15:43:10.553 回答