我有一个C# Windows Forms控件,它的DateTimePicker被设置为只显示时间(自定义格式h:mm),我的用户几乎总是会点击Updown按钮来控制分钟。 然而,默认情况下,该控件更新的是小时。
我怎样才能让这些按钮默认控制分钟?
另外,作为奖励,当分钟超过60时,是否可以使小时向前滚动?
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;
}
}
当 datetimePicker
得了 Focus
然后你向右边发送键,它会自动进入分钟部分。
dateTimePicker1.GotFocus += new EventHandler(dateTimePicker1_GotFocus);
void dateTimePicker1_GotFocus(object sender, EventArgs e)
{
SendKeys.Send("{right}");
}
你需要定制datetimepicker.create usercontrol with datetimepicker and handle keydown event.
DateTimePicker通过切换小时和分钟中哪一个有焦点来响应右箭头键。这意味着,如果DTP失去焦点,然后重新获得焦点,焦点就会回到小时。你可以通过处理DTP,然后重新实例化它,使SendKeys.Send("{right}")总是从有焦点的小时开始,来解决这个问题,但这可能会给你带来一个问题,那就是如何做。
我认为已经解决了这个问题。
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:
QEF