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

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

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

16.08.2008 20:48:00
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

3
17.08.2008 00:27:15

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

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

1
16.08.2008 21:38:26

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

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

0
16.08.2008 22:02:07

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

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

1
17.08.2008 06:50:14

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

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

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

0
22.10.2008 20:18:13