Установка фокуса на предыдущий элемент управления

У меня проблема с потерей управления разделительной панелью, и мне нужно вернуть ее в исходное состояние.

В моем приложении используется SplitContainer; и когда мой элемент управления загружает данные в панель2 разделителя, фокус смещается на панель1.

Есть элементы управления, которые имеют tabStop = true на обеих панелях, поскольку табуляция и shift + tab должны работать как на панелях, так и на разделителе.

Чтобы вернуть его обратно, добавьте объект Control в GotFocus для элемента управления panel2 и используйте его в _enter на панели1, чтобы установить фокус обратно на panel2. Однако мне нужно сбросить этот объект управления; что я не могу сделать в _leave панели2, так как при возврате элемента управления GotFocus будет вызываться снова.


person Megha    schedule 21.06.2016    source источник


Ответы (2)


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



обновить после некоторой очистки в комментариях ..

На Msdn о событиях, связанных с фокусом элемента управления, вы обнаружите, что "Enter" событие всегда является первым в цепочке событий, вторым всегда является «GotFocus». См .: https://msdn.microsoft.com/it-it/library/system.windows.forms.control.gotfocus(v=vs.110).aspx

Вы можете оценить переменную состояния фокуса управления в событии «Enter» и назначить ее в событии «GotFocus», избегая сброса чего-либо в ваших событиях выхода.

Таким образом, вы всегда должны знать предыдущий элемент управления, сфокусированный в обработчике «Enter» каждого элемента управления (вы можете использовать один и тот же обработчик для всех элементов управления) и предъявлять свои требования.

Если вам нужно управлять некоторыми разделенными элементами управления на нескольких панелях, вы также можете реализовать словарь, который отображает каждую панель, на которой находится элемент управления, поэтому, если вы переключаетесь с одной панели на другую, вы всегда можете знать последний элемент управления этой панели, на которой был фокус .

person Ciro Corvino    schedule 21.06.2016
comment
Я попытался установить флаг как true в _gotfocus и как false в _Leave элемента управления A, но мне нужно, чтобы это значение было истинным в _enter элемента управления B. Это сделано для того, чтобы приложение могло установить фокус обратно на A, если предыдущий элемент управления был A Но я не могу допустить, чтобы это значение оставалось ложным, поскольку B должен устанавливать фокус с помощью tab и shift + tab. Затем я попытался установить его как false в Leave of control B, но поскольку я делаю .Focus () для управления A, этот флаг каждый раз сбрасывается как true. - person Megha; 22.06.2016
comment
Я просмотрел и попробовал решения, представленные в stackoverflow.com/questions/4428100/ и stackoverflow.com/questions/4408751/ - person Megha; 22.06.2016
comment
Я неправильно понял, что вы имели в виду ... Я думаю, что переменная управления областью на уровне модуля - хорошее решение вашей проблемы - person Ciro Corvino; 22.06.2016
comment
Не могли бы вы подробнее рассказать об этом? Как я могу выборочно установить предыдущий сфокусированный элемент управления? Переменная, которую я использовал, была на уровне проекта, поэтому я могу установить ее в gotfocus () элемента управления A, использовать в enter () элемента управления B и затем сбросить в leave () элемента управления A. Но это возвращало мою переменную в gotfous () после выхода (). - person Megha; 22.06.2016
comment
Я имел в виду ссылки на решения, которые вы сказали в комментарии, за который я проголосовал ... однако, тем не менее, видя вашу проблему лучше, мне кажется, что я понимаю, что вы хотите переключаться с элемента управления на другой с помощью табуляции и обратно с помощью сдвига табуляции, и вам нужно сохранить информацию о том, какой элемент управления был сфокусирован последним .. Я отвечаю в ответе - person Ciro Corvino; 22.06.2016

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

person Megha    schedule 01.07.2016