Остановите "Дин" при нажатии Enter
У меня очень простое приложение Windows Forms. И в Windows (или, по крайней мере, в приложениях Windows Forms), когда вы нажимаете Enter, находясь внутри однострочного элемента управления TextBox, вы слышите Ding. Это неприятный звук, означающий, что вы не можете ввести новую строку, потому что это однострочный TextBox.
Это все хорошо. Тем не менее, в моей форме, у меня есть 1 TextBox и кнопка поиска. И я разрешаю пользователю выполнять поиск, нажимая клавишу ВВОД после того, как они закончили печатать, чтобы им не приходилось использовать мышь для нажатия кнопки поиска.
Но этот звук Дин происходит. Это очень раздражает.
Как мы можем сделать так, чтобы в моей форме вообще не звучал звук?
@ Дэвид Х - Вот как я определяю нажатие клавиши Enter:
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
// Perform search now.
}
}
17 ответов
Проверьте свойство Form.AcceptButton. Вы можете использовать его для указания кнопки по умолчанию для формы, в данном случае для нажатия кнопки ввода.
Из документов:
Это свойство позволяет вам назначить действие по умолчанию, которое происходит, когда пользователь нажимает клавишу ВВОД в вашем приложении. Кнопка, назначенная этому свойству, должна быть 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
}
}
Просто добавь 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.
}
}
Вы можете использовать KeyPress вместо 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
}
}
}
В 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 для элементов управления.
Я наткнулся на этот пост, пытаясь обработать KeyDown, это сработало для меня.
If e.KeyCode = Keys.Enter Then
e.SuppressKeyPress = True
btnLogIn.PerformClick()
End If
Подавление нажатия клавиши останавливает отправку события в базовый элемент управления. Это должно работать, если вы вручную обрабатываете все, что будет делать клавиша ввода в этом текстовом поле. Извините за Visual Basic.
$("#txtSomething").keypress(function (e) {
if (e.which == 13) {
e.Handled = true; //This will prevent the "ding" sound
//Write the rest of your code
}
});
Есть очень мало шансов, что кто-нибудь получит этот ответ, но некоторые другие ответы действительно страшны. Подавление события на 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
Я надеюсь, что это поможет:
Использование KeyDown вместо KeyPress
private void AdvancedSearch_TXT_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
AdvancedSearch_TXT.Clear();
e.SuppressKeyPress = true;
}
}
e.SupressKeyPress
сделает свое дело
Ну, я жил с этой проблемой достаточно долго и искал ее здесь.
Подумав об этом в течение некоторого времени и желая найти самый простой способ исправить это, я нашел самый простой, но не очень элегантный способ исправить это.
Вот что я сделал.
- Поместите 2 невидимые кнопки "ОК" и "Отмена" на форму.
- Установите свойство AcceptButton и CancelButton на форме для невидимых кнопок.
- Код не добавлен в кнопки!
Это решило все второстепенные проблемы, перечисленные в этой теме, включая ToolStripMenu. Моей самой большой жалобой был BindingNavigator, когда я вводил номер записи в текущую позицию для навигации и нажимал ввод.
В соответствии с первоначальным вопросом, в котором программисту требовалась функция поиска при нажатии кнопки ввода, я просто поместил код поиска в невидимую кнопку OK!
Пока что это, кажется, решает все проблемы, но, как мы все знаем в Visual Studio, что-то, вероятно, возникнет.
Единственный возможный изящный способ, о котором я мог бы подумать, - это написать новый класс обработки нажатий клавиш, который является способом большой работы для большинства моих проектов.
Вы можете установить для многострочного текстового поля значение 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();
}
}
Касательно
e.SuppressKeyPress = true;
решение, оно отлично работает само по себе. Параметр
SuppressKeyPress
к истине также устанавливает
Handled
к истине, поэтому нет необходимости использовать
e.Handled= true;
Я изменил свойства текстового поля для многострочного текстового поля, и он работает для меня.
void RTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
//do ...
bool temp = Multiline;
Multiline = true;
e.Handled = true;
Multiline = temp;
}
}