Как установить фокус на TextBox при загрузке формы

Работает как в A2003, так и в A2007.

Как мы можем гарантировать, что выбранный TextBox получит фокус при загрузке формы? Если мы поместим MyTextBox.SetFocus в Form_Load, то получим ошибку:

can't move the focus to the control

Эта форма предназначена для быстрого ввода данных, и форма несколько перестраивается в зависимости от последних использованных настроек. Таким образом, существует несколько различных текстовых полей, любому из которых может потребоваться фокус в зависимости от пользователя. Мы не можем просто исправить это во время разработки, присвоив MyTextBox TabIndex=0.

В справке говорится что-то о вызове Repaint, что просто не имеет никакого смысла:

Вы можете переместить фокус только на видимый элемент управления или форму. Форма и элементы управления в форме не видны, пока не завершится событие загрузки формы. Таким образом, если вы используете метод SetFocus в событии Load формы для перемещения фокуса на эту форму, вы должны использовать метод Repaint перед методом SetFocus.


person hawbsl    schedule 25.02.2011    source источник
comment
Вы используете MyTextBox.SetFocus (с соответствующим именем элемента управления) или Me!MyTextBox.SetFocus (или Me.MyTextBox.SetFocus)? НИКОГДА не рекомендуется ссылаться на элементы управления, кроме как на элементы родительской формы, и, возможно, существует проблема синхронизации с настройкой пространства имен, которое требуется для разрешения неуказанной ссылки на элемент управления. Однако я только что попробовал неопределенный элемент управления в своей тестовой форме, и он отлично работал без Меня! или я.   -  person David-W-Fenton    schedule 26.02.2011
comment
@ Дэвид-В-Фентон, теперь я действительно сбит с толку. Я думал, что Кевин Росс подсказал мне   -  person hawbsl    schedule 26.02.2011
comment
Ответ Кевина на самом деле не касается вопроса. Мне вообще не понадобился Repaint в моем тестовом примере. Вы уточнили, был ли у вас источник записей и иногда вы открывали форму без загруженных записей? В этом случае элементы управления не будут существовать, поэтому вы не сможете установить для них фокус.   -  person David-W-Fenton    schedule 28.02.2011


Ответы (4)


Вы не можете установить фокус, поскольку элементы управления еще не существуют, попробуйте вместо этого поместить код в событие OnActivate.

Или просто поместите DoCmd.Repaint в событие OnLoad, прежде чем пытаться установить фокус. Оба должны работать, но я не рядом с компьютером, чтобы проверить

person Kevin Ross    schedule 25.02.2011
comment
Спасибо за ответ. перемещение кода в OnActivate не сработало, потому что форма является всплывающей и (очевидно) в Access для всплывающих окон нет события Activate. Но перенос кода в событие Open (что, как я полагаю, почти одно и то же) решил проблему. - person hawbsl; 25.02.2011
comment
когда я погуглил, почему Form_Activate не срабатывает, один из результатов объяснил, что для всплывающих окон нет Form_Activate, вместо этого используйте Open, что я и сделал. И это, кажется, работает. Хотя теперь ты меня беспокоишь. - person hawbsl; 26.02.2011

Лучше всего в этом случае убедиться, что текстовое поле для получения фокуса имеет номер 0 в свойстве Tab Index.

person Fionnuala    schedule 25.02.2011
comment
индекс тега или индекс вкладки? Кстати, поздравляю с тем, что вы стали первым и пока единственным обладателем Золотого значка по тегу [ms-access] - person hawbsl; 25.02.2011
comment
Поздравляем. Я не заметил, что ты золотой. :-) - person HansUp; 25.02.2011
comment
@HansUp Это просто очень ярко отполированная латунь, но при правильном свете ... :) - person Fionnuala; 25.02.2011

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

Я использую метод .SetFocus довольно регулярно и без проблем. Я не помню, чтобы когда-либо получал сообщение об ошибке при установке фокуса на элемент управления, который уже имеет его, как заявил Рему в своем ответе.

Я полагаю, что существует и третий случай, когда вы пытаетесь установить фокус на элемент управления в верхнем/нижнем колонтитуле формы связанной формы, в которой были все его записей отфильтровано. Я знаю, что эта ситуация вызывает «исчезновение» содержимого в несвязанном поле со списком, но я думаю, что это также может привести к хаосу с методом SetFocus. Однако, если вы открываете форму в режиме ввода данных, это не должно быть проблемой.

person mwolfe02    schedule 25.02.2011
comment
я не спрашиваю, почему я получаю ошибку. я понимаю, что доступ не позволяет нам установить фокус в загрузке формы, потому что форма еще не видна. я спрашиваю, как динамически указать, какое текстовое поле получит фокус, учитывая, что вы не можете выполнить SetFocus при загрузке формы. - person hawbsl; 25.02.2011
comment
Я вижу сейчас. извините за шум. - person mwolfe02; 25.02.2011
comment
Этот пост вовсе не шум. Видимая форма, даже если PopUp имеет значение True, не имеет проблем с установкой фокуса на видимый и включенный элемент управления в событии OnLoad. Я только что проверил. У него нет проблем. Это даже работает, если вы открываете скрытую всплывающую форму. Здесь явно происходит что-то еще, как вы, @mwolfe02, намекнули, поскольку простой случай работает очень хорошо. - person David-W-Fenton; 26.02.2011

Переместите SetFocus в событие On Current формы. Тогда должно работать, если, возможно, источник записи формы не содержит записей, и вы установили для свойства формы «Разрешить добавления» значение «Нет». В этом случае ваше текстовое поле не будет доступно для SetFocus, но в моем тестировании оно не выдает ошибку .

person HansUp    schedule 25.02.2011