Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TextBox: событие Focus Leave и Tab/Shift+Tab, не работает переход на другие контроллы 
V
    Опции темы
markowww
Дата 17.5.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.2.2003
Где: В Вологде-где

Репутация: нет
Всего: нет



На форме имеется TextBox. Требуется при получении/потере им фокуса изменять свойство BorderStyle
Код

private void TextBox_Enter(object sender, EventArgs e)
{
   TextBox.BorderStyle = BorderStyle.FixedSingle;
}

private void TextBox_Leave(object sender, EventArgs e)
{
   TextBox.BorderStyle = BorderStyle.None;
}


Кажется, что все просто. Но! При реализации события Leave контрол перестает терять фокус по Tab/Shift+Tab.

Как показала отладка, если убрать смену BorderStyle, то при использовании Tab/Shift+Tab события происходят так, как и должны, т.е. :

   Enter
   Leave (Нажатие клавиш)

В противном случае получается следующая последовательность:

   Enter
   Leave (Нажатие клавиш)
   Enter
   Enter
   Leave
   Enter   

Подскажите, где я не прав, как исправить или сделать подругому? 
PM MAIL   Вверх
DVariuS
Дата 18.5.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: нет
Всего: 8



markowww, все дело в разной последовательности генерации событий: http://msdn.microsoft.com/ru-ru/library/sy...trol.leave.aspx
Решить проблему можно так:
Код

private void textBox1_Leave(object sender, System.EventArgs e)
        {
            if (!textBox1.ContainsFocus)
                textBox1.BorderStyle = BorderStyle.None;
            else
            {
                textBox1.BorderStyle = BorderStyle.None;
                SelectNextControl(textBox1, true, true, true, true);
            }
        }

PM MAIL   Вверх
Bishop
Дата 18.5.2009, 11:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 2
Всего: 16



markowww, можно так
Код
private void textBox1_Leave(object sender, EventArgs e)
{
    SelectNextControl((Control)sender, true, true, true, true);
    textBox1.BorderStyle = BorderStyle.None;
}


PM WWW ICQ   Вверх
DVariuS
Дата 18.5.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: нет
Всего: 8



Bishop, согласен, а то я наворотил  smile 
PM MAIL   Вверх
markowww
Дата 18.5.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.2.2003
Где: В Вологде-где

Репутация: нет
Всего: нет



Bishop, DVariuS 

Про SelectNextControl я думал, но почему-то у меня не вышло. Вечером попробую.
PM MAIL   Вверх
markowww
Дата 18.5.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.2.2003
Где: В Вологде-где

Репутация: нет
Всего: нет



Два момента:

1. Вызов SelectNextControl должен находится перед сменой стиля, иначе программа уходит в бесконечный цикл
2. Один из параметров - направление поиска следующего контролла. Если оставить в таком виде, то все работает по Tab и не работает по Shift + Tab, точнее листает не в том направлении.

DVariuS, самое интересное, что в мсдн в примере для события Leave используется изменение внешнего вида контролла, поэтому я сначала не придал значениея разной последовательности генерации событий. В итоге Reflector показал, что при смене стиля в конечном итоге вызывается Invalidate для всего контролла, что и ведет ко всем проблемам.

Видимо, придется делать обходным путем.


PM MAIL   Вверх
DVariuS
Дата 18.5.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: нет
Всего: 8



markowww, похоже в данном случае лучший вариант - наследовать от TextBox  smile 
PM MAIL   Вверх
markowww
Дата 19.5.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.2.2003
Где: В Вологде-где

Репутация: нет
Всего: нет



Цитата(DVariuS @ 18.5.2009,  20:20)
markowww, похоже в данном случае лучший вариант - наследовать от TextBox  smile

В принципе, можно сварганить TextBox, окруженный, например, прямоугольником. Но в данном случае задача не требует таких затрат. Таких TextBox'ов на форме немного, можно перебрать в ручную.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.