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



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



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



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



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



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



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

12 ответов:

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

документы:

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

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

это работает для меня:

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

попробовать

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

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

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

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

использовать 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

      }
   }
}

просто добавить 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.
    }
}

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

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

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

есть очень мало шансов, что кто-то получит этот ответ, но некоторые другие ответы действительно страшны. Подавление события на KeyDown убивает 2 дополнительных события за один удар. Установка e.Handled свойство true бесполезно в этом контексте.
Лучший способ-установить Form.AcceptButton свойство к фактической кнопке поиска.
Существует также другой способ использования Enter ключ-некоторые люди могут захотеть, чтобы он действовал как . Для этого добавьте новый 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

установите кнопку поиска IsDefault свойство true. Это кнопка по умолчанию и она будет автоматически нажата нажатию Enter.

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

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

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

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

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

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

  1. поставить 2 невидимые кнопки "ОК" и "отмена" на форме.
  2. установите свойство AcceptButton и CancelButton в форме на невидимые кнопки.
  3. не добавлено никакого кода пуговицы!

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

в соответствии с исходным вопросом, в котором программист хотел функцию поиска, когда была нажата кнопка ввода, я просто поместил код поиска в невидимую кнопку OK!

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

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

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

Comments

    Ничего не найдено.