Нажмите Enter, чтобы перейти к следующему элементу управления
У меня есть несколько TextBox на WinForm. Я хотел бы, чтобы фокус переместился к следующему элементу управления, когда нажата клавиша Enter? Всякий раз, когда текстовое поле получает контроль, он также выбирает текст, так что любое редактирование заменяет текущее.
Каков наилучший способ сделать это?
Ответы
Ответ 1
Tab as Enter: создать пользовательский элемент управления, который наследует текстовое поле, переопределить метод KeyPress
. Если пользователь нажимает кнопку ввода, вы можете либо позвонить SendKeys.Send("{TAB}")
, либо System.Windows.Forms.Control.SelectNextControl()
. Обратите внимание, что вы можете достичь того же, используя событие KeyPress
.
Фокус. Весь текст: снова, через переопределение или события, настройте событие GotFocus
, а затем вызовите метод TextBox.Select
.
Ответ 2
Несколько примеров кода на С# с помощью SelectNextControl.
Первый переход к следующему элементу управления при нажатии ВВОД.
private void Control_KeyUp( object sender, KeyEventArgs e )
{
if( (e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return) )
{
this.SelectNextControl( (Control)sender, true, true, true, true );
}
}
Второй использует стрелки ВВЕРХ и ВНИЗ для перемещения по элементам управления.
private void Control_KeyUp( object sender, KeyEventArgs e )
{
if( e.KeyCode == Keys.Up )
{
this.SelectNextControl( (Control)sender, false, true, true, true );
}
else if( e.KeyCode == Keys.Down )
{
this.SelectNextControl( (Control)sender, true, true, true, true );
}
}
См. MSDN Выбрать методNextControl
Ответ 3
В событии KeyPress, если пользователь нажал Enter, вызовите
SendKeys.Send("{TAB}")
Самый простой способ реализовать автоматический выбор текста при получении фокуса - создать подкласс TextBox в вашем проекте со следующим переопределением:
Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
SelectionStart = 0
SelectionLength = Text.Length
MyBase.OnGotFocus(e)
End Sub
Затем используйте этот пользовательский TextBox вместо стандартного текстового поля WinForms для всех ваших форм.
Ответ 4
Вы можете поместить обработчик KeyPress
в свои текстовые поля и посмотреть, какой ключ был использован.
Чтобы обработать выбор текста, поместите обработчик в событие GotFocus
.
Вы также можете рассмотреть, как (или если вам нужно) обрабатывать многострочные текстовые поля.
Ответ 5
Это может помочь:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
//
// Detect the KeyEventArg key enumerated constant.
//
if (e.KeyCode == Keys.Enter)
{
MessageBox.Show("You pressed enter! Good job!");
}
}
Ответ 6
private void txt_invoice_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
txt_date.Focus();
}
private void txt_date_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
txt_patientname.Focus();
}
}
Ответ 7
Вы также можете написать свой собственный элемент управления для этого, если вы хотите использовать его чаще.
Предполагая, что у вас несколько текстовых полей в гриде, это выглядит примерно так:
public class AdvanceOnEnterTextBox : UserControl
{
TextBox _TextBox;
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(AdvanceOnEnterTextBox), null);
public static readonly DependencyProperty InputScopeProperty = DependencyProperty.Register("InputScope", typeof(InputScope), typeof(AdvanceOnEnterTextBox), null);
public AdvanceOnEnterTextBox()
{
_TextBox = new TextBox();
_TextBox.KeyDown += customKeyDown;
Content = _TextBox;
}
/// <summary>
/// Text for the TextBox
/// </summary>
public String Text
{
get { return _TextBox.Text; }
set { _TextBox.Text = value; }
}
/// <summary>
/// Inputscope for the Custom Textbox
/// </summary>
public InputScope InputScope
{
get { return _TextBox.InputScope; }
set { _TextBox.InputScope = value; }
}
void customKeyDown(object sender, KeyEventArgs e)
{
if (!e.Key.Equals(Key.Enter)) return;
var element = ((TextBox)sender).Parent as AdvanceOnEnterTextBox;
if (element != null)
{
int currentElementPosition = ((Grid)element.Parent).Children.IndexOf(element);
try
{
// Jump to the next AdvanceOnEnterTextBox (assuming, that Labels are inbetween).
((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition + 2)).Focus();
}
catch (Exception)
{
// Close Keypad if this was the last AdvanceOnEnterTextBox
((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = false;
((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = true;
}
}
}
}
Ответ 8
Попробуйте использовать:
SendKeys.Send("{TAB}")