我如何在C# Windows Forms DateTimePicker中控制上行控件只显示分钟?

问题描述 投票:1回答:4

我有一个C# Windows Forms控件,它的DateTimePicker被设置为只显示时间(自定义格式h:mm),我的用户几乎总是会点击Updown按钮来控制分钟。 然而,默认情况下,该控件更新的是小时。

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

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

c# winforms datetimepicker
4个回答
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;
        }
    }

1
投票

datetimePicker 得了 Focus 然后你向右边发送键,它会自动进入分钟部分。

dateTimePicker1.GotFocus += new EventHandler(dateTimePicker1_GotFocus);

void dateTimePicker1_GotFocus(object sender, EventArgs e)
{
 SendKeys.Send("{right}");
}

0
投票

你需要定制datetimepicker.create usercontrol with datetimepicker and handle keydown event.


0
投票

DateTimePicker通过切换小时和分钟中哪一个有焦点来响应右箭头键。这意味着,如果DTP失去焦点,然后重新获得焦点,焦点就会回到小时。你可以通过处理DTP,然后重新实例化它,使SendKeys.Send("{right}")总是从有焦点的小时开始,来解决这个问题,但这可能会给你带来一个问题,那就是如何做。

我认为已经解决了这个问题。

  • 将DTP的 "ShowUpDown "属性设置为false。
  • 在表单中添加一个NumericUpDown控件。
  • 使NUD的 "宽度 "为18像素,以隐藏其值框。
  • 小心地将NUD放在DTP的日期选择下箭头上,使其看起来有点像DTP的UpDown箭头。
  • 将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;
    }
}

这样就会产生一个看起来像DTPNUD的组合,用户可以通过以下方式改变时间值: 1:

  • 在小时或分钟字段中输入数字
  • 按键盘上的向上、向下、向左和向右箭头,可以改变任何一个字段,小时或分钟,有焦点,最重要的是
  • 点击NUD的上升箭头,可以全面改变时间:当分钟从59到0或从0到59时,时间就会改变。

QEF

© www.soinside.com 2019 - 2024. All rights reserved.