Вопрос

В 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 потому что так сказано выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top