В чем разница между Control.Select() и Control.Focus()?
-
03-07-2019 - |
Вопрос
В WinForms, чтобы установить фокус на определенный элемент управления, мне всегда приходится вызывать Control.Select()
и Control.Focus()
чтобы заставить его работать.
В чем разница и правильный ли это подход?
Решение
Focus — это метод низкого уровня, предназначенный в первую очередь для авторов пользовательских элементов управления.Вместо этого программисты приложений должны использовать метод Select или свойство ActiveControl для дочерних элементов управления или метод Activate для форм.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx
Другие советы
Focus() — это функция низкого уровня, которая фактически устанавливает фокус.
Select() — это метод более высокого уровня.Сначала он итеративно просматривает родительскую иерархию элемента управления, пока не находит элемент управления-контейнер.Затем он устанавливает свойство ActiveControl этого контейнера (вызываемому элементу управления).Однако логика в этих методах непростая, и для контейнеров UserControl предусмотрена специальная обработка.
В качестве примера того, чем они отличаются, если вы пытаетесь установить для элемента управления приложения Forms фокус по умолчанию при его открытии, будет работать только Select() при вызове в конструкторе после InitializeComponent().Focus() не будет.
Просто добавлю к этой теме: я обнаружил, что при написании пользовательского элемента управления другие элементы управления перемещались из одной формы в другую (вновь созданную форму).Исходная форма больше не могла выбирать элемент управления, но использование фокуса позволяло это сделать.Я думаю, это подчеркивает ответы об уровнях, на которых работают эти методы.Но это также означает, что недостаточно просто сказать «использовать Select» на более высоком уровне, поскольку select больше не работает должным образом в исходной форме (не то чтобы я должен был поместить его в другую форму — я принимаю это)
Focus() в некоторых ситуациях может привести к тому, что окно, владеющее элементом управления, получит фокус, если у него его нет.Select() не вызывает захват фокуса окном.
Из личного опыта я написал пользовательский элемент управления, наследующий ComboBox Windows.Мне пришлось написать код, чтобы переопределить OnEnter
событие, и у меня там было заявление, в котором говорилось
If Me.Focused Then ... Else ...
Однако, к сожалению, это дало неожиданный результат.Если бы я позвонил MyCustomerComboControl.Select
(в событиях Load, Shown или Activated) он вызывал OnEnter
метод, но не смог его зарегистрировать, он имел фокус (т.е.«Фокус» был ложным), но если я вызвал «Фокус», это сработало.Более того Select
работало, если форма была открыта, т.е.если бы я выбрал другой элемент управления, а затем повторно выбрал исходный элемент управления, все было бы в порядке.Поэтому в любых других обстоятельствах, кроме моего сценария, используйте Select
потому что так сказано выше.