2008-08-16 6 views
5

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

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

ответ

3

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

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

1

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

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

0

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

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

1

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

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

0

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

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

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

Смежные вопросы