按Enter时停止“ Ding”


124

我有一个非常简单的Windows窗体应用程序。并且,在Windows(或至少Windows Forms应用程序)中,当您在单行TextBox控件内按Enter时,您会听到叮叮。这是一种令人不愉快的声音,表明您不能输入换行符,因为它是单行的TextBox。

一切都很好。但是,在我的窗体中,我有1个文本框和一个搜索按钮。而且我允许用户通过按Enter他们已经完成键入之后,所以他们不执行搜索必须使用鼠标单击搜索按钮。

但是这种叮sound的声音发生了。真烦人

我们如何才能使声音完全不在我的Form中播放?

@David H-这是我检测回车的方式:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}

当焦点位于文本框中时,如何检测到已按下Enter键?
David Heffernan

在属性窗格中,双击KeyDown或KeyUp事件。然后,在“代码视图”中,键入要在我的问题中输入的代码。
bentr 2011年

2
KeyPress可能是正确的事件,您需要设置e.Handled = true
David Heffernan

谢谢@David,我不知道这件事:)
bentr 2011年

7
我希望有某种方法可以抑制烦人的叮ding声,但允许按键弹起。有时按键只是按键,不需要报警。
flipdoubt 2011年

Answers:


56

Form.AcceptButton属性。您可以使用它为表单指定默认按钮,在这种情况下,请按Enter。

从文档:

此属性使您可以指定当用户在应用程序中按ENTER键时发生的默认操作。分配给该属性的按钮必须是当前窗体上的IButtonControl或当前窗体上的容器内的IButtonControl。

当用户按下转义键时,还有一个CancelButton属性。


1
谢谢@mdm,这对我来说效果最好。:)当我有更多代表时,我将再次投票赞成。
bentr 2011年

1
@bendr我有同样的问题..但是我正在使用UserControl ..它没有Form.AcceptButton ..如何解决它?
Murhaf Sousli

1
Visual Studio似乎在“属性”窗格中没有此字段。显然,它必须用代码完成。this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
克里斯

5
这不适用于ToolStripButtons,或者如果您想使用Enter键来验证TextBox或ToolStripTextBox。更好的方法是使用ToolStripTextBox为我工作的Lucio Fonseca的答案。
罗伯特S.15年

我看不到您的解决方案,您没有更实用的练习方法
PedroÁvila19年

198

这个对我有用:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

    //Se apertou o enter
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down

        this.doSomething();

        e.Handled = true;
        e.SuppressKeyPress = true;

     }

 }

SuppressKeyPress是真正的把戏。希望对您有所帮助。


30
我认为这是唯一有效的答案。 e.Handled = true;不够 才是SuppressKeyPress诀窍。
Jonathon Reinhart 2013年

12
无论是否使用Handed或SuppressKeyPress,在这种情况下textBox1_KeyUp都会响起
stackuser83

4
为我工作ToolStripTextBox.KeyDown。没有其他解决方案。谢谢!
罗伯特S.15年

1
它对我textboxKeyDown事件均
不起作用

7
这应该是公认的答案。当前接受的答案要求在表单上放置一个不愉快的标准按钮。
贾维德(Javid)

56

尝试

textBox.KeyPress += new KeyPressEventHandler(keypressed);

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true; //this line will do the trick
    }
}

正确,但是只有当焦点仍然在TextBox上时,它才起作用。如果用户Tab先按下怎么办?
mdm

4
@mdm取决于UI设计。也许OP仅在焦点位于文本框上时才需要此操作。这很普遍。
David Heffernan

2
如果用户按下Tab键,则焦点将不再位于TextBox上,下一个将要聚焦的Contorl是Button控件,当您按Enter时它不会发出声音。:-)
bentr 2011年

@David,谢谢您的榜样。我刚试过 每当我在.KeyPress事件中放置e.Handled = true时,其他任何代码都不会执行。唯一发生的事情是TextBox中的所有Text都被选中了(我什至没有选择任何文本的代码)
bentr 2011年

1
卢西奥·丰塞卡(Lucio Fonseca)的答案是我发现解决该问题的唯一答案。
Jonathon Reinhart 2013年

15

只需添加e.SuppressKeyPress = true;“ if”语句即可。

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //If true, do not pass the key event to the underlying control.
        e.SuppressKeyPress = true;  //This will suppress the "ding" sound.*/

        // Perform search now.
    }
}

13

您可以使用KeyPress代替KeyUp或KeyDown,它的效率更高,这是处理方法

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            e.Handled = true;
            button1.PerformClick();
        }
    }

对“丁”说和平


2
这对我来说非常有效。e.Handled显然会禁用“ Ding”。将“提交”按钮(在我的情况下)设置为默认值,对我来说是行不通的,因为我想对表单上其他文本框的“输入”键进行不同的处理。<br/> <br/> :对于这个项目,我正在使用VB。因此,我将其转换为:e.KeyChar = ChrW(Keys.Enter Then ....
Mark Ainsworth

1
在内KeyDown,使用e.Handlede.SuppressKeyPress对我不起作用-仍在叮叮当当。但是按照此处的建议进行更改以使用KeyPress' event and e.Handled`可以很好地完成它。
Jinlye

这应该是正确的答案,谢谢
Firas Shrourou

7

用于SuppressKeyPress在处理击键后停止对其进行继续处理。

public class EntryForm: Form
{
   public EntryForm()
   {
   }

   private void EntryTextBox_KeyDown(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         e.Handled = true;
         e.SuppressKeyPress = true;
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
          e.Handled = true;
          e.SuppressKeyPress = true;
          // do some stuff

      }
   }

   private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
         // do some stuff

      }
   }
}

2

我在尝试处理对我有用的KeyDown时偶然发现了这篇文章。

If e.KeyCode = Keys.Enter Then
   e.SuppressKeyPress = True
   btnLogIn.PerformClick()
End If

按下按键可停止将事件发送到基础控件。如果您要手动处理Enter键在该文本框中执行的所有操作,则此方法应该起作用。对不起,Visual Basic。


2

任何人都有机会获得这个答案,但是其他答案确实令人恐惧。抑制事件可KeyDown在一次打击中杀死2个额外事件。在这种情况下,将e.Handled属性设置true为无用。
最好的方法是将Form.AcceptButton属性设置为实际的搜索按钮。
还有另一种利用Enter键的方法-有些人可能希望它充当TAB按钮。为此,添加一个new ButtonLocationForm区域之外(即(-100, -100))设置其属性-将Visible属性设置为在某些情况下false可能会禁用Button处理程序。将Form.AcceptButton属性设置为新按钮。在Click事件处理程序中添加以下代码
this.SelectNextControl(ActiveControl, true, true, true, true)

现在,你可能要转移focus,只有当focus它在TextBox你可能想要么测试ActiveControl类型或使用e.Supress财产的并不意味着使用控件的事件处理程序EnterTAB 就是这样。您甚至不需要捕获e.KeyCode


1
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

            e.Handled = true; //This will prevent the "ding" sound

            //Write the rest of your code
        }
    });

这就是我想要的。
2014年

1

在WinForms上,由于未指定表单属性AcceptButton,Enter键会产生叮叮声。如果不需要AcceptButton,则可以通过将KeyPreview形式设置为true并输入以下KeyPress事件来抑制叮叮声:

private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
        e.Handled = true;
}

无论激活了什么控件,按Enter键都不会再有叮当声。由于键事件的处理顺序为KeyDown,KeyPress和KeyUp,因此Enter键仍可用于控件的KeyDown事件。


0

将“搜索”按钮的IsDefault属性设置为true。这将使其成为默认按钮,并且在按下Enter键时将自动单击它。


从您链接到的文档To specify the default button of a form, set the AcceptButton property of the form to the desired button.
mdm

是的,我自己对此进行了调查。似乎两种方法都是可以互换的。AcceptButton似乎更时尚,但我已经习惯了IsDefault
2011年

0

好吧,我在这个问题上生活了足够长的时间,并在这里进行了查找。

在考虑了很长时间之后,想要最简单的方法来解决它,我想出了最简单但又不是那么优雅的方法来解决它。

这是我所做的。

  1. 在窗体上放置2个不可见的按钮“确定”和“取消”。
  2. 将窗体上的AcceptButton和CancelButton属性设置为不可见的按钮。
  3. 没有在按钮上添加代码!

这解决了该线程中列出的所有次要问题,包括ToolStripMenu。我最大的抱怨是BindingNavigator,当时我要在“当前”位置中输入一个记录号以导航至并按Enter。

按照最初的问题,当按下回车按钮时程序员想要搜索功能,我只是将搜索代码放在不可见的“确定”按钮中!

到目前为止,这似乎可以解决所有问题,但是众所周知,Visual Studio可能会出现一些问题。

我想到的唯一可能的其他优雅方法是编写一个新的按键处理类,该类可以为我的大多数项目带来很多工作。


0

您可以将文本框多行设置为true,然后按Enter键。

private void yourForm_Load(object sender, EventArgs e)
    {
        textBox1.Multiline = true;
    }

//then write your TextBox codes
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // doSomething();
    }
}


-2
void RTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == Keys.Enter)
    {
        //do ...
        bool temp = Multiline;
        Multiline = true;
        e.Handled = true;
        Multiline = temp;
    }
}

1
这是一个多余的答案,仅包含代码,没有解释。而且,所有Multiline代码都是完全不相关的。
Jonathon Reinhart 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.