Остановите 'Ding' при нажатии Enter

124

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

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

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

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

@David H - Вот как я обнаруживаю нажатие Enter:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}
bendr
источник
Как определить, что клавиша Enter была нажата, когда фокус находится в текстовом поле?
Дэвид Хеффернан,
На панели свойств дважды щелкните событие KeyDown или KeyUp. Затем в режиме просмотра кода вы набираете код, который я собираюсь задать в своем вопросе.
bendr 09
2
KeyPress, вероятно, правильное событие, и вы хотите установить e.Handled = true
Дэвид Хеффернан
Спасибо, @David, я этого не знал :)
bendr 09
7
Хотелось бы, чтобы был какой-то способ подавить раздражающий дребезжание, но позволить нажатию клавиши пузыриться. Иногда нажатие клавиши - это просто нажатие клавиши, и нет необходимости в тревоге.
flipdoubt 02

Ответы:

56

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

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

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

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

MDM
источник
1
Спасибо @mdm, у меня это сработало лучше всего. :) Я вернусь, чтобы проголосовать, когда у меня будет больше репутации.
bendr 09
1
@bendr у меня такая же проблема .. но я использую UserControl .. у него нет Form.AcceptButton .. как это исправить?
Мурхаф Сусли 01
1
Visual Studio, похоже, не имеет для этого поля на панели свойств. Очевидно, это должно быть сделано в коде. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Крис
5
Это не сработает для ToolStripButtons или если вы хотите использовать клавишу ENTER для проверки TextBox или ToolStripTextBox. Лучшим подходом был бы ответ Люцио Фонсека, который работал у меня с ToolStripTextBox.
Роберт С.
Я не вижу вашего решения, у вас нет практического упражнения, чтобы стать более просвещенным
Педро Авила
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
12
textBox1_KeyUp будет звонить в этой ситуации независимо от Handled или SuppressKeyPress
stackuser83
4
У меня работает с ToolStripTextBox.KeyDown. Никакое другое решение не помогло. Спасибо!
Роберт С.
1
Это не работает для меня на моем textboxи KeyDownсобытия
Алекс Джолиг
7
Это должен быть принятый ответ. Текущий принятый ответ требует размещения стандартной кнопки в форме, что неприятно.
Джавид
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 09
4
@mdm Зависит от дизайна пользовательского интерфейса. Возможно, OP хочет это действие только тогда, когда фокус находится в текстовом поле. Это довольно часто.
Дэвид Хеффернан,
2
Если пользователь нажал Tab, фокус больше не будет на TextBox, следующим Contorl, который будет Focused, будет элемент управления Button, который не издает такого звука, когда вы нажимаете на нем Enter. :-)
bendr 09
@ Дэвид, спасибо за ваш пример. Я только что попробовал. И всякий раз, когда я помещаю e.Handled = true в событие .KeyPress, никакой другой код не выполняется. Единственное, что происходит, - весь текст в TextBox становится выбранным (а у меня даже нет кода, который выделяет какой-либо текст)
bendr
1
Ответ Лусио Фонсека был единственным, который, как я обнаружил, решил проблему.
Jonathon Reinhart
15

Просто добавьте 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.
    }
}
brandonstrong
источник
13

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

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

И скажи мир "Дину"

Mawardy
источник
2
Это отлично сработало для меня. e.Handled, по-видимому, отключает «Дин». Сделать кнопку «Отправить» (в моем случае) по умолчанию у меня не сработало бы, потому что я хотел по-другому обрабатывать клавишу «Ввод» для других текстовых полей в форме. <br/> <br/> Кстати, : Для этого проекта я использую VB. поэтому вместо того, чтобы использовать e.KeyChar, я конвертирую его: if e.KeyChar = ChrW (Keys.Enter Then ....
Марк Эйнсворт,
1
Внутри меня KeyDownиспользование e.Handledи e.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

      }
   }
}
Snehasish
источник
2

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

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

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

Colin
источник
2

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

ArtK
источник
1
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

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

            //Write the rest of your code
        }
    });
Code.Town
источник
Это то, что я ищу.
Сид
1

В WinForms клавиша Enter вызывает звук Ding, поскольку свойство формы AcceptButton не указано. Если вам не нужен 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.

Zruty
источник
Из документов, на которые вы To specify the default button of a form, set the AcceptButton property of the form to the desired button.
ссылались
Да, я сам исследовал это. Кажется, что оба подхода взаимозаменяемы. AcceptButtonкажется более стильным, но я к IsDefaultсебе привык .
Zruty 09
0

Я жил с этой проблемой достаточно долго и нашел ее здесь.

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

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

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

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

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

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

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

user2793447
источник
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();
    }
}
Шедрак Иквабе
источник
0

Я изменил свойства текстового поля для многострочного текстового поля, и он работает для меня.

Кристиан Фонтейн
источник
Ответ уже был дан ниже 22 фев. Ты тоже должен позаботиться о [входе];)
вкусности
-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