如何阻止NumericUpDown在EnterKeyPress上播放'Ding'声音

时间:2014-12-20 05:16:29

标签: c# alert numericupdown

我的表单上有几个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();
    }
}

而且我不认为它正在发生,因为我正在处理它,好像我没有注册事件(删除上面的第一行),它仍然会播放噪音。

4 个答案:

答案 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接受的值,并且不会发出“叮”的声音。