首页 文章

按Enter键时停止'Ding'

提问于
浏览
98

我有一个非常简单的Windows窗体应用程序 . 而且,在Windows(或至少Windows窗体应用程序)中,当您在单行TextBox控件中按Enter键时,您会听到一个丁 . 这是一种不愉快的声音,表示你无法输入换行符,因为它是一个单行的TextBox .

这一切都很好 . 但是,在我的表单中,我有一个TextBox和一个搜索按钮 . 我允许用户在按下Enter后执行搜索,因为他们必须使用鼠标单击“搜索”按钮 .

但是这个丁声就出现了 . 这很烦人 .

我们如何才能使声音在我的表格中根本不发挥?

@David H - 这是我如何检测输入按下:

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

12 回答

  • 165

    您可以使用KeyPress而不是KeyUp或KeyDown,它更有效,这里是如何处理

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

    并向'丁'说和平

  • 49

    查看Form.AcceptButton属性 . 您可以使用它来指定表单的默认按钮,在这种情况下是按Enter键 .

    来自文档:

    此属性使您可以指定当用户在应用程序中按Enter键时发生的默认操作 . 分配给此属性的按钮必须是位于当前表单上或位于当前表单上的容器内的IButtonControl .

    当用户按下escape时,还有一个CancelButton属性 .

  • 8

    这个对我有用:

    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是真正的技巧 . 我希望能帮助你 .

  • -2

    尝试

    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
        }
    }
    
  • 47

    只需在"if"语句中添加 e.SuppressKeyPress = true; 即可 .

    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.
        }
    }
    
  • 2

    处理后,使用 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
    
          }
       }
    }
    
  • 1

    我在试图处理一个对我有用的KeyDown时偶然发现了这篇文章 .

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

    按下按键可以阻止事件发送到基础控件 . 如果您手动处理输入键将在该文本框中执行的所有操作,则此操作应该有效 . 抱歉Visual Basic .

  • 0

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

    现在,您可能只想在 focusfocus 时调用 focus ,您可能想要测试 ActiveControl 类型,或者在控件的事件处理程序中使用 e.Supress 属性,而不是使用 Enter 作为 TAB 即使需要捕获 e.KeyCode

  • 0

    将搜索按钮的IsDefault属性设置为 true . 这将使其成为默认按钮,按下Enter键时将自动单击该按钮 .

  • 7
    $("#txtSomething").keypress(function (e) {
            if (e.which == 13) {
    
                e.Handled = true; //This will prevent the "ding" sound
    
                //Write the rest of your code
            }
        });
    
  • 7

    好吧,我和这个问题住了很长时间,并在这里查找 .

    在考虑了这个问题很长一段时间后,想要用最简单的方法来修复它,我想出了最简单但不那么优雅的方法来修复它 .

    这就是我做的 .

    • 在表单上放置2个隐形按钮"Ok"和"Cancel" .

    • 将表单上的AcceptButton和CancelButton属性设置为不可见按钮 .

    • 没有为按钮添加代码!

    这解决了此线程中列出的所有次要问题,包括ToolStripMenu . 我最大的抱怨是BindingNavigator,当我在当前位置输入记录号以导航并按下回车键时 .

    按照程序员按下输入按钮时想要搜索功能的原始问题,我只需将搜索代码放在隐形OK按钮中!

    到目前为止,这似乎解决了所有问题,但正如我们所知道的Visual Studio,可能会出现一些问题 .

    我能想到的唯一另一种可能的优雅方式是编写一个新的击键处理类,这对我的大多数项目来说都是很有用的 .

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

相关问题