Переопределить поведение вкладки в WinForms - PullRequest
5 голосов
/ 17 августа 2008

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

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

Ответы [ 5 ]

3 голосов
/ 17 августа 2008

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

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

1 голос
/ 17 августа 2008

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

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

1 голос
/ 17 августа 2008

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

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

0 голосов
/ 23 октября 2008

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

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

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

0 голосов
/ 17 августа 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...