Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Разработка Windows Forms > TextBox: событие Focus Leave и Tab/Shift+Tab |
Автор: markowww 17.5.2009, 22:27 | ||
На форме имеется TextBox. Требуется при получении/потере им фокуса изменять свойство BorderStyle
Кажется, что все просто. Но! При реализации события Leave контрол перестает терять фокус по Tab/Shift+Tab. Как показала отладка, если убрать смену BorderStyle, то при использовании Tab/Shift+Tab события происходят так, как и должны, т.е. : Enter Leave (Нажатие клавиш) В противном случае получается следующая последовательность: Enter Leave (Нажатие клавиш) Enter Enter Leave Enter Подскажите, где я не прав, как исправить или сделать подругому? |
Автор: DVariuS 18.5.2009, 11:02 | ||
markowww, все дело в разной последовательности генерации событий: http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.leave.aspx Решить проблему можно так:
|
Автор: Bishop 18.5.2009, 11:05 | ||
markowww, можно так
|
Автор: DVariuS 18.5.2009, 11:07 |
Bishop, согласен, а то я наворотил ![]() |
Автор: markowww 18.5.2009, 13:08 |
Bishop, DVariuS Про SelectNextControl я думал, но почему-то у меня не вышло. Вечером попробую. |
Автор: markowww 18.5.2009, 20:03 |
Два момента: 1. Вызов SelectNextControl должен находится перед сменой стиля, иначе программа уходит в бесконечный цикл 2. Один из параметров - направление поиска следующего контролла. Если оставить в таком виде, то все работает по Tab и не работает по Shift + Tab, точнее листает не в том направлении. DVariuS, самое интересное, что в мсдн в примере для события Leave используется изменение внешнего вида контролла, поэтому я сначала не придал значениея разной последовательности генерации событий. В итоге Reflector показал, что при смене стиля в конечном итоге вызывается Invalidate для всего контролла, что и ведет ко всем проблемам. Видимо, придется делать обходным путем. |
Автор: DVariuS 18.5.2009, 20:20 |
markowww, похоже в данном случае лучший вариант - наследовать от TextBox ![]() |
Автор: markowww 19.5.2009, 00:47 | ||
В принципе, можно сварганить TextBox, окруженный, например, прямоугольником. Но в данном случае задача не требует таких затрат. Таких TextBox'ов на форме немного, можно перебрать в ручную. |