Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > TextBox: событие Focus Leave и Tab/Shift+Tab


Автор: markowww 17.5.2009, 22:27
На форме имеется 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   

Подскажите, где я не прав, как исправить или сделать подругому? 

Автор: DVariuS 18.5.2009, 11:02
markowww, все дело в разной последовательности генерации событий: http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.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);
            }
        }

Автор: Bishop 18.5.2009, 11:05
markowww, можно так
Код
private void textBox1_Leave(object sender, EventArgs e)
{
    SelectNextControl((Control)sender, true, true, true, true);
    textBox1.BorderStyle = BorderStyle.None;
}


Автор: DVariuS 18.5.2009, 11:07
Bishop, согласен, а то я наворотил  smile 

Автор: 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  smile 

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

В принципе, можно сварганить TextBox, окруженный, например, прямоугольником. Но в данном случае задача не требует таких затрат. Таких TextBox'ов на форме немного, можно перебрать в ручную.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)