#.net #vb.net #winforms
Вопрос:
В моей компании есть большое приложение, написанное на VB6, и по историческим причинам навигация по приложению осуществляется с помощью клавиши Enter, а не с помощью клавиши Tab. Я не знаю VB6, но я знаю, что в настоящее время они устанавливают фокус для каждого элемента управления в большой инструкции select в событии ввода формы, если это ключ ввода. Теперь мы начинаем переходить на .NET и должны поддерживать согласованность, чтобы пользователям не приходилось вводить вкладки в одних формах и вводить данные в других. Я хочу написать формы предков, которые будут автоматически вводиться из поля в поле вместо вкладок. Коллега сказал мне, что в VB6 это делается для обработки кнопок не в событии ЩЕЛЧКА, а в событии ВВОДА. Мне нужно продолжать это делать, чтобы у меня не осталось событий ввода, которые можно было бы передать обратно в VB6 после завершения моей формы. Порядок событий для кнопок таков
- button_PreviewKeyDown
- Button_Click (по-видимому, заменяет событие нажатия клавиши)
- form_KeyUp
- button_KeyUp
Я создал формы следующим образом:
- В событии KeyUp формы ПРЕДКА проверяет, является ли это ключом ввода. Если это клавиша ввода, а активный элемент управления не является кнопкой, он перемещается в следующее поле в порядке вкладок. В противном случае он игнорирует ключ и позволяет элементу управления обрабатывать его. Если это кнопка, то предок не предполагает, что знает, куда кнопка хочет направить управление, потому что это будет зависеть от того, что кнопка хочет сделать, когда она «нажата».
- На кнопках дочерней формы событие click ничего не делает, и обработка дублируется в событии KeyUp и событии щелчка мышью.
- Форма ПРЕДКА имеет защищенное логическое значение EatKeyUp, которое ДОЧЕРНИЙ элемент может установить в значение True. Это используется, когда дочерней форме необходимо отправить окно сообщений, потому что, если пользователь войдет с помощью кнопки OK в окне сообщений, все равно останется событие ввода ключа, которое будет использовано формой-предком.
Хотя, клаги, похоже, это действительно работает. Что я хочу знать, так это есть ли лучший способ? Возможно, где-то есть какая-то настройка, в которой я могу указать своему приложению «Вводить через формы вместо вкладок»? Являются ли события, которые я использую вместо событий щелчка, лучшими?
Ответ №1:
Лучшая реализация состоит в том, чтобы использовать свойство AcceptButton формы, установить его на скрытую кнопку где-нибудь в форме. Затем, когда пользователь нажимает enter, нажимается кнопка, затем в событии нажатия кнопки вы выполняете код для перехода к следующему элементу управления. Чтобы выбрать следующий элемент управления, вы можете просто выбрать его в списке элементов.
Самый простой способ сделать это-создать базовую форму, а затем в ней есть кнопка и логика принятия.
Комментарии:
1. Я не пробовал этого, потому что я больше не на этой работе (ура!). Но это выглядит разумно — спасибо!
Ответ №2:
Может быть, теперь, когда вы конвертируете свое время, чтобы продвинуть идею соблюдения стандартов Windows.
В прямом ответе на ваш вопрос, приведенный выше механизм является довольно распространенным способом сделать это, другой способ сделать это-установить свойство предварительного просмотра ключа формы и обработать его непосредственно в форме. Ни один из способов не является особенно хорошим решением, поскольку навигация по окнам просто не предназначена для этого,
Комментарии:
1. Я знаю, что навигация по окнам не предназначена для этого. МАЛЬЧИК, я в курсе. Но мы не можем позволить, чтобы один экран из сотен отображался с помощью вкладок, а остальные-с помощью ввода. Было бы неразумно конвертировать все остальные во вкладки, а затем позже вернуться и преобразовать в .NET.