У меня есть несколько текстовых полей. Я бы хотел, чтобы кнопка Enter действовала как Tab. Так что, когда я буду в одном текстовом поле, нажатие Enter переместит меня на следующий. Не могли бы вы рассказать мне, как реализовать этот подход без добавления кода внутри класса текстового поля (без переопределения и т.д., Если это возможно)?
Как сделать Enter в текстовом поле действовать как кнопка TAB
Ответ 1
Вот код, который я обычно использую. Это должно быть в событии KeyDown.
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
UPDATE
Другой способ отправляет ключ "TAB"! И переопределение метода делает его проще:)
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Enter))
{
SendKeys.Send("{TAB}");
}
return base.ProcessCmdKey(ref msg, keyData);
}
Ответ 2
Вы можете написать в keyDown любого элемента управления:
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
GetNextControl не работает на Vista.
Чтобы заставить его работать с Vista, вам нужно будет использовать следующий код, чтобы заменить this.GetNextControl...:
System.Windows.Forms.SendKeys.Send("{TAB}");
Ответ 3
Вам не нужно создавать "обработчик событий ввода"
Все, что вам нужно сделать, это сделать "центральное" событие KeyDown:
Пример
private void General_KeyDown(object sender, KeyPressEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
}
Затем все, что вам нужно сделать, это пойти в конструктор, чтобы выбрать все текстовые поля, которые вы хотите прокрутить, с помощью EnterKey (выберите их, удерживая Ctrl и нажав на текстовое поле с помощью мыши), затем перейдите в "События" (кнопка гром, как кнопка), выполните поиск Keydown события и типа внутри General_KeyDown. Теперь у всех выбранных текстовых ящиков будет одно и то же событие keydown:) Это делает все, что угодно, намного проще, вы можете представить себе форму со 100 текстовыми полями, и вы хотите циклически перебирать все с помощью ввода.... создание отдельного события для каждого texbox. ну, а не правильный способ сделать программу, она не опрятная. Надеюсь, это помогло!
Blockquote
Ответ 4
Это сработало для меня
if (e.Key == Key.Enter)
((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));
Ответ 5
Если вы определяете Tab Order всех элементов управления и создаете Form.KeyPreview = True, вам нужно только это:
Private Sub frmStart_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Enter Then
System.Windows.Forms.SendKeys.Send("{TAB}")
End If
End Sub
Ответ 6
Важно отметить, что если вы получите раздражающий "звук" или предупредительный звук каждый раз, когда элемент управления ожидает связанного с ним кнопки управления, а e.Handled = true
- это не всегда ответ, чтобы избавиться от шума/звука/динг.
Если элемент управления (то есть однострочный текстовый блок) ожидает связанную кнопку с 'ENTER' вашей записью, то вы также должны иметь дело с "отсутствующим" элементом управления.
e.Handled = e.SuppressKeyPress = true;
Это может быть полезно, если вы избавитесь от звука "ding".
Для того, что было в моих обстоятельствах, моим пользователям необходимо было использовать "ENTER KEY", когда мы переходили из приложения терминала/зеленого экрана в приложение Windows, и они больше использовались для "ENTER-IN" через поля а не табуляции.
Все эти методы работали, но все еще сохраняли раздражающий звук, пока я не добавил e.SuppressKeyPress
.
Ответ 7
Для тех из вас, что код в vb...
Public Class NoReturnTextBox
Inherits System.Windows.Forms.TextBox
Const CARRIAGE_RETURN As Char = Chr(13)
' Trap for return key....
Private Sub NoReturnTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar = CARRIAGE_RETURN Then
e.Handled = True
System.Windows.Forms.SendKeys.Send(vbTab)
End If
End Sub
End Class
Ответ 8
Я использую этот код в одном из событий keydown keydown
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
Невозможно обработать это событие keydown
для всех текстовых полей в моей форме. Предложить что-нибудь. Благодаря
Ответ 9
Это решение, которое я использую для VB.NET
-
Задайте Keypreview = True в ваших свойствах формы.
-
Поместите этот код в событие keydown формы:
Если (e.KeyData = Keys.Enter) Затем
'для любого многострочного элемента управления, вы должны выйти, чтобы позволить многострочному нажатию "ввод текста" делает пропуски строк.
If ActiveControl.Name = txtMyMutilineTextBox.Name Then Exit Sub e.SuppressKeyPress = True SelectNextControl(ActiveControl, True, True, True, True)
Конец Если
Наслаждайтесь!!!!
Xabier Aberasturi Larruzea
Ответ 10
Принимая дикое предположение:
// on enter event handler
parentForm.GetNextControl().Focus();
Ответ 11
Я бы совпадал с тем, что Фарабус и Арул отвечали так:
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ‘\r’)
{
e.Handled = true;
parentForm.GetNextControl().Focus()
}
}
Сообщите мне, если это поможет! JFV