Зупиніть "Ding", натиснувши Enter


124

У мене дуже простий додаток для Windows Forms. І в Windows (або, принаймні, для програм Windows Forms) під час натискання клавіші Enter під час однорядкового керування TextBox ви чуєте звук Ding. Це непідвласне звучання, яке вказувало, що ви не можете вводити новий рядок, оскільки це однорядковий TextBox.

Це все добре. Однак у своїй формі у мене є 1 TextBox і кнопка пошуку. І я дозволяю користувачеві здійснювати пошук, натискаючи Enter після того, як вони закінчать вводити текст, тому їм не потрібно використовувати мишу, щоб натиснути кнопку Пошук.

Але цей звук Дінга виникає. Це дуже дратує.

Як ми можемо зробити так, щоб просто цей звук не грав у моїй формі?

@David H - Ось як я визначаю натискання клавіші введення:

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

Як ви виявите, що Enter натиснуто, коли фокус знаходиться в текстовому полі?
Девід Геффернан

На панелі властивостей двічі клацніть подія KeyDown або KeyUp. Потім в Код перегляду ви вводите код, який я збираюся поставити у своєму питанні для yah.
Бендер

2
KeyPress - це, мабуть, правильна подія, і ви хочете встановити e.Handled = true
David

Дякую, @David, я цього не знав :)
bendr

7
Я хотів би, щоб був якийсь спосіб придушити дратівливу дігу, але дозволити натискання клавіші піднятися. Іноді натискання клавіші - це лише натискання клавіші, не потрібно тривоги.
flipdoubt

Відповіді:


56

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

З документів:

Це властивість дозволяє призначити дію за замовчуванням, яка має відбутися, коли користувач натисне клавішу ENTER у вашій програмі. Кнопка, присвоєна цій властивості, повинна бути IButtonControl, що знаходиться у поточній формі або розташований у контейнері поточної форми.

Існує також властивість CancelButton, коли користувач натискає клавішу escape.


1
Дякую @mdm, це працювало найкраще для мене. :) Я повернусь до оновлення, коли у мене буде більше представників.
Бендр

1
@bendr У мене така ж проблема .. але я використовую UserControl .. він не має Form.AcceptButton .. як це виправити?
Murhaf Sousli

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зробило трюк.
Джонатан Райнхарт

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

4
@mdm Залежить від дизайну інтерфейсу. Можливо, ОП бажає цієї дії лише тоді, коли фокус знаходиться на текстовому полі. Це досить часто.
Девід Геффернан

2
Якщо користувач натиснув Tab, фокус більше не буде на TextBox, наступний Contorl, який буде зосереджений, - це управління кнопками, яке не видає цього звуку, якщо натиснути на нього Enter. :-)
bendr

@David, дякую за ваш приклад. Я просто спробував це. І щоразу, коли я поміщаю e.Handled = true у подію .KeyPress, жоден інший код не виконується. Єдине, що відбувається - це те, що Текст у TextBox стає вибраним (і у мене навіть немає коду, який вибирає будь-який текст)
bendr

1
Відповідь Лусіо Фонсеки була єдиною, яку я знайшов, щоб піклуватися про проблему.
Джонатан Райнхарт

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

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'. Якщо зробити кнопку "Надіслати" (у моєму випадку) за замовчуванням, для мене це не спрацювало б, оскільки я хотів по-іншому обробляти клавішу "Enter" для інших текстових полів. <br/> <br/> До речі : Для цього проекту я використовую VB. тому замість кастингу e.KeyChar я конвертую його: якщо e.KeyChar = ChrW (Keys.Enter then ....
Mark Ainsworth

1
У межах KeyDown, використовуючи e.Handledта e.SuppressKeyPressне працюючи для мене - все ще лунає. Але змінивши його, як тут пропонується, щоб використовувати KeyPress' event and e.Handled`, це вдалося.
Джінлі

Це має бути правильна відповідь, дякую
Фірас Шруру

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

Придушення натискання клавіші зупиняє передачу події на базовий елемент управління. Це має спрацювати, якщо ви вручну обробляєте все, що буде робити клавіша введення в межах цього текстового поля. Вибачте про Visual Basic.


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


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

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

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

Це те, що я шукаю.
Sid

1

У WinForms клавіша Enter викликає звук Дінга, оскільки властивість форми AcceptButton не вказана. Якщо вам не потрібен AcceptButton, звук дзвін може бути придушений, встановивши форму KeyPreview на істинне і введіть наступну подію 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сам.
Зрути

0

Ну, я жив із цією проблемою досить довго і шукав її тут.

Думаючи про це досить довго і бажаючи найпростішого способу виправити це, я придумав найпростіший, але не такий елегантний спосіб виправити це.

Ось що я зробив.

  1. Покладіть на форму 2 невидимих ​​кнопки «Ок» та «Скасувати».
  2. Встановіть у формі властивості AcceptButton та CancelButton невидимі кнопки.
  3. Кнопки не додали код!

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

Відповідно до оригінального запитання, в якому програміст хотів виконувати функцію пошуку, коли була натиснута кнопка введення, я просто поклав код пошуку в невидиму кнопку OK!

Поки це, здається, вирішує всі проблеми, але, як ми всі знаємо з Visual Studio, щось, мабуть, з’явиться.

Єдиним іншим можливим елегантним способом, про який я міг би придумати, було б написати новий клас поводження з натисканням клавіш, який буде значною мірою працювати для більшості моїх проектів.


0

Ви можете встановити багаторядковий текст у текстовому полі, а потім обробити клавішу 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

я змінив властивості textbox для багаторядкового textbox, і це працює для мене.


Відповідь вже була заявлена ​​нижче 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код абсолютно не має значення.
Джонатан Райнхарт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.