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

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

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

Ответов (5)

Решение

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

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

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

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

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

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

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

Спасибо за вклад!

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

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

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