Подтвердить что ты не робот

Какая разница между Control.Select() и Control.Focus()?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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