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