我的表单上有几个NumericUpDown
控件,每当我按下回车键时它就会激活,它会在我耳边播放这种可怕的DING噪音。如果我不处理KeyPress
事件,它会播放,如果我处理KeyPress
事件,无论有没有e.Handled = true
,它都会播放:
myNumericUpDown.KeyPress += myNumericUpDown_KeyPress;
的
private void myNumericUpDown_KeyPress(object sender, EventArgs e)
{
if (e.KeyChar == 13)
{
e.Handled = true; //adding / removing this has no effect
myButton.PerformClick();
}
}
而且我不认为它正在发生,因为我正在处理它,好像我没有注册事件(删除上面的第一行),它仍然会播放噪音。
答案 0 :(得分:2)
使用KeyDown()和SuppressKeyPress,但单击KeyUp()中的按钮:
private void myNumericUpDown_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = e.SuppressKeyPress = true;
}
}
private void myNumericUpDown_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = e.SuppressKeyPress = true;
myButton.PerformClick();
}
}
*如果您将表单AcceptButton
属性设置为“myButton”,则根本需要 NO 代码!
答案 1 :(得分:2)
好吧,你不应该在GUI应用程序中使用Enter键。它保留给另一个角色。丁!是一个不起眼的提醒。
您可以通过实际为Enter键提供预期用途来轻松解决此问题。在表单上拖放一个按钮,将其Visible属性设置为False。选择表单并将AcceptButton属性设置为该按钮。没有更多的叮当声。
从Enter的奇数用法中稍微推断,您可能希望使Enter键的行为与在控制台模式应用程序中的行为一样,将用户带到下一个控件。通常使用Tab键代替。您可以通过将此代码复制/粘贴到表单类中来实现这一点,并为您提供UI:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Enter) {
var ctl = this.ActiveControl;
var box = ctl as TextBoxBase;
// Make Enter behave like Tab, unless it is a multiline textbox
if (ctl != null && (box == null || !box.Multiline)) {
this.SelectNextControl(ctl, true, true, true, true);
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
答案 2 :(得分:1)
NumericUpDown还检查您按下的键是否为“数字键”(1-9, - ,。),这显然不是回车键的情况。完成您想要的操作后,只需将e.KeyChar
设置为任意数字键即可。设置e.Handled = true
仍然是必要的,否则系统会将您的输入视为您实际按下该键并插入数字。
//Do something
e.Handled = true;
e.KeyChar = (char)Keys.D2;
对我而言,这完美无缺。
答案 3 :(得分:0)
我做这招:
在numericUpandDown
KeyPress函数中,如果e.KeyChar=13
(回车键),则必须设置e.Handled=true;
(这将防止控件以任何方式更改其值),并且紧接在set e.KeyChar=(char)46;
(或任何其他可接受的数字值,因为e.Handled
已设置为true,所以不会被写入。)
通过这种方式,e.KeyChar
具有Visual Studio接受的值,并且不会发出“叮”的声音。