Сведения о вопросе

nikolya

01:34, 13th August, 2020

Теги

c#   .net   winforms    

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

Просмотров: 533   Ответов: 5

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

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



  Сведения об ответе

SKY

02:56, 10th August, 2020

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

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


  Сведения об ответе

baggs

22:25, 9th August, 2020

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

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


  Сведения об ответе

park

12:00, 2nd August, 2020

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

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


  Сведения об ответе

ASSembler

04:11, 25th August, 2020

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

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


  Сведения об ответе

pumpa

10:32, 1st August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться