В чем разница между Control.Select () и Control.Focus ()? - PullRequest
46 голосов
/ 29 апреля 2009

В WinForms, чтобы установить фокус на конкретный элемент управления, мне всегда кажется, что нужно вызвать Control.Select() и Control.Focus(), чтобы заставить его работать.

В чем разница, и правильный ли это подход?

Ответы [ 6 ]

37 голосов
/ 05 августа 2009

Focus () - это функция низкого уровня, которая фактически устанавливает фокус.

Select () - метод более высокого уровня. Сначала он смотрит итеративно вверх в родительской иерархии элемента управления, пока не найдет контейнерный элемент управления. Затем он устанавливает свойство ActiveControl этого контейнера (для вызываемого элемента управления). Однако логика в этих методах не проста, и для контейнеров UserControl существует специальная обработка.

23 голосов
/ 29 апреля 2009

Фокус - это низкоуровневый метод, предназначенный главным образом для авторов пользовательских элементов управления. Вместо этого разработчики приложений должны использовать метод Select или свойство ActiveControl для дочерних элементов управления или метод Activate для форм.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

4 голосов
/ 11 июня 2013

В качестве примера того, как они отличаются, если вы пытаетесь установить элемент управления для приложения Forms на фокус по умолчанию, при котором вы открываете его, только Select () будет работать при вызове в конструкторе после InitializeComponent (). Фокус () не будет.

3 голосов
/ 30 декабря 2013

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

1 голос
/ 05 апреля 2017

Focus (), в некоторых ситуациях, может заставить окно, владеющее элементом управления, получить фокус, если оно не имело фокусировки. Выбор () не вызывает захват фокуса окном.

1 голос
/ 13 февраля 2012

Из личного опыта я написал пользовательский элемент управления, унаследовавший Windows ComboBox. Мне пришлось написать код, чтобы переопределить событие OnEnter, и там было утверждение, говорящее

If Me.Focused Then ... Else ...

Однако, к сожалению, он дал неожиданный результат. Если я вызывал MyCustomerComboControl.Select (в событиях Load, Shown или Activated), он вызывал метод OnEnter, но не мог его зарегистрировать, имел фокус (т. Е. Focused is False), но если я вызывал Focus, он работал. Кроме того, Select работало, если форма была открыта, т.е. если я выбрал другой элемент управления, а затем повторно выбрал исходный элемент управления, все было в порядке. Так что в любых других обстоятельствах, кроме моего сценария, используйте Select, потому что это сказано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...