Остановите «Дин» при нажатии Enter - PullRequest
107 голосов
/ 09 июня 2011

У меня очень простое приложение для Windows Forms.И в Windows (или, по крайней мере, в приложениях Windows Forms), когда вы нажимаете клавишу Enter, находясь внутри однострочного элемента управления TextBox, вы слышите Ding.Это неприятный звук, означающий, что вы не можете ввести новую строку, потому что это однострочный TextBox.

Это нормально.Тем не менее, в моей форме, у меня есть 1 TextBox и кнопка поиска.И я разрешаю пользователю выполнять поиск, нажимая клавишу ВВОД после того, как они закончили печатать, чтобы у него не было , чтобы использовать мышь для нажатия кнопки поиска.

Но этоЗвук дин звучит.Это очень раздражает.

Как мы можем сделать так, чтобы в моей форме вообще не звучал звук?

@ David H - Вот как я определяю нажатие клавиши ввода:

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

Ответы [ 12 ]

176 голосов
/ 03 мая 2013

у меня работает:

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 - это действительно трюк. Я надеюсь, что это поможет вам.

51 голосов
/ 09 июня 2011

Попробуйте

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
    }
}
49 голосов
/ 09 июня 2011

Проверьте свойство Form.AcceptButton . Вы можете использовать его для указания кнопки по умолчанию для формы, в данном случае для нажатия кнопки ввода.

Из документов:

Это свойство позволяет назначать действие по умолчанию, которое происходит, когда пользователь нажимает клавишу ВВОД в вашем приложение. Кнопка, назначенная это свойство должно быть IButtonControl, который находится на текущем форма или находится в контейнере на текущая форма.

Существует также свойство CancelButton , когда пользователь нажимает escape.

11 голосов
/ 18 декабря 2014

Вы можете использовать KeyPress вместо KeyUp или KeyDown его более эффективным и вот как справиться

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

и скажи мир Дин

10 голосов
/ 10 июля 2015

Просто добавьте 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.
    }
}
7 голосов
/ 15 сентября 2015

Используйте 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 голосов
/ 26 февраля 2016

Есть очень мало шансов, что кто-нибудь получит этот ответ, но некоторые другие ответы действительно страшны.Подавляющее событие на 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)

Теперь вы можете передавать focus только тогда, когда focus на TextBox, возможно, вы захотите либо протестироватьActiveControl введите или используйте свойство e.Supress в обработчиках событий элементов управления, не предназначенных для использования Enter как TAB Вот и все.Вам даже не нужно захватывать e.KeyCode

2 голосов
/ 26 апреля 2013

Я наткнулся на этот пост, пытаясь обработать KeyDown, это сработало для меня.

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

Подавление нажатия клавиши останавливает отправку события в базовый элемент управления. Это должно работать, если вы вручную обрабатываете все, что будет делать клавиша ввода в этом текстовом поле. Извините за Visual Basic.

1 голос
/ 13 ноября 2013
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

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

            //Write the rest of your code
        }
    });
0 голосов
/ 20 апреля 2015

Ну, я жил с этой проблемой достаточно долго и искал ее здесь.

Подумав об этом в течение некоторого времени и желая найти самый простой способ исправить это, я нашел самый простой, но не очень элегантный способ исправить это.

Вот что я сделал.

  1. Поместите 2 невидимые кнопки «ОК» и «Отмена» на форму.
  2. Установите свойства AcceptButton и CancelButton на форме для невидимых кнопок.
  3. Добавлен код без кнопок!

Это решило все второстепенные проблемы, перечисленные в этой теме, включая ToolStripMenu. Моя самая большая жалоба была BindingNavigator, когда я вводил номер записи в текущую позицию для навигации и нажимал ввод.

В соответствии с первоначальным вопросом, в котором программисту требовалась функция поиска при нажатии кнопки ввода, я просто поместил код поиска в невидимую кнопку ОК!

Пока что это, кажется, решает все проблемы, но, как мы все знаем в Visual Studio, что-то, вероятно, возникнет.

Единственный другой возможный элегантный способ, которым я мог бы придумать, - это написать новый класс обработки нажатий клавиш, который является способом большой работы для большинства моих проектов.

...