Переопределить поведение вкладки в WinForms

У меня есть UserControl, состоящий из трех текстовых полей. В форме у меня может быть один или несколько или мой UserControl. Я хочу реализовать собственное поведение вкладок, поэтому, если пользователь нажимает Tab во втором текстовом поле, я должен переходить к третьему текстовому полю только в том случае, если во втором текстовом поле что-то введено. Если во втором текстовом поле ничего не введено, следующий элемент управления формы должен получить фокус в соответствии с обычным поведением вкладки. Если пользователь ничего не ввел в первом или втором TextBox и на вкладке Presses, существует особый случай, когда элемент управления в форме следует пропустить.

Используя ProcessDialogKey, мне удалось заставить его работать нормально, но у меня все еще есть одна проблема. Мой вопрос заключается в том, есть ли способ определить, как элемент управления WinForms получил фокус, поскольку я также хотел бы знать, получил ли мой UserControl фокус с Tab или Shift-Tab, а затем делать мои странные вещи, но если пользователь щелкает элемент управления, я не хочу делать ничего особенного.


person Robert Höglund    schedule 16.08.2008    source источник


Ответы (5)


Как правило, я бы сказал, что переопределение стандартного поведения клавиши TAB было бы плохой идеей. Возможно, вы можете сделать что-то вроде отключения 3-го текстового поля до тех пор, пока во 2-м текстовом поле не будет сделана действительная запись.

Теперь, сказав это, я также нарушил это правило по просьбе заказчика. Мы сделали клавишу ввода аналогичной клавише табуляции, где клавиша ввода сохраняла значение в текстовом поле и перемещала курсор в следующее поле.

person Rob Thomas    schedule 16.08.2008

Я не думаю, что есть встроенный способ, которым вы могли бы это сделать. Все события фокуса WinForms (GotFocus,LostFocus,Enter,Leave) вызываются с пустыми параметрами EventArgs, которые не дадут вам никакой дополнительной информации.

Лично я бы отключил третье текстовое поле, как сказал Роб Томас. Однако, если вы полны решимости сделать это, будет несложно настроить ручное (читай: хакерское) решение. После нажатия клавиши табуляции (если фокус находится на втором текстовом поле) установите переменную внутри формы. Если следующим объектом в фокусе будет третье текстовое поле, то вы точно знаете, как это произошло.

person TheSmurf    schedule 16.08.2008

Причина такого странного поведения вкладок кроется в скорости процесса ввода. Было действительно приятно получить некоторый вклад, я не думал об отключении текстового поля, но это действительно могло сработать. Но использование клавиши Enter для подтверждения ввода даже не пришло мне в голову. Это будет работать намного лучше. Пользователь может ввести числа, а затем нажать Enter, чтобы принять ввод, и следующее возможное текстовое поле будет активным. Это все равно, что есть торт и есть его тоже. Фактор скорости присутствует, поскольку при использовании клавиши ввода не нужно делать ненужных вкладок, чтобы перейти к правильному полю, а использование клавиши ввода рядом с цифровой клавиатурой делает его действительно плавным.

Спасибо за отзыв!

person Robert Höglund    schedule 17.08.2008

Я согласен с DannySmurf. Возня с порядком табуляции может доставить вам неприятности позже, если требования к приложению изменятся.

Еще одна вещь, которую вы могли бы сделать, это реализовать какой-то мастер для пользователя.

person Patrik Svensson    schedule 16.08.2008

Лучше, чем отключать элементы управления, попробуйте поиграть с TabStop — если это false, элемент управления будет просто пропущен при табуляции.

Я бы также предположил, что событие Changed TextBox — это место для обновления TabStop на других элементах управления.

Я сделал что-то подобное с элементом управления входом в систему, где пользователи могли ввести либо имя пользователя, либо адрес электронной почты (в отдельные поля), а также свой пароль, и tabStop — это то, что я использовал для выполнения работы.

person Bevan    schedule 22.10.2008