Как заставить клавишу Enter работать аналогично Tab - переходить к следующему элементу управления

Заказчик захотел, чтобы после нажатия Enter пользователь переходил на следующий элемент управления, аналогично нажатию Tab. Основная идея проста - перехватываем нажатие клавиши Enter и посылаем форме нажатие Tab, но есть одна тонкость - если мы хотим разом установить подобное поведение для всей формы, а не каких-то конкретных управляторов, необходимо выставить в true свойство KeyPreview.

После чего вешаем код на соответствующее событие нашей формы, я выбрал KeyUp, используя свойство KeyCode параметра KeyEventArgs:

if (e.KeyCode == Keys.Enter)
{
    System.Windows.Forms.SendKeys.Send("{TAB}");
}

Вышеописанная связка может привести к интересному глюку, если мы реализуем ее в диалоговом окне, вызываемом с другой формы и переходим на него нажимая Enter на кнопке вызова диалогового окна (родительская форма может работать по аналогичной схеме). В таком случае диалоговое окно получит KeyUp и последующий Tab при нажатии на кнопку (Enter'ом) на родительской форме (и сразу перейдет на следующий элемент управления). Объяснения столь дивному чуду природы нет, есть лекарство - подписываемся на событие KeyPress, которое происходит только тогда, когда элемент находится в фокусе. Маленькая проблема, у класса KeyPressEventArgs нет свойства KeyCode, есть только KeyChar, так что определять нажатую клавишу придется немного иначе:

if (e.KeyChar == (char)Keys.Return)
{
    System.Windows.Forms.SendKeys.Send("{TAB}");
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>