Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2011, 15:13   #1
FiloXSee
Пользователь
 
Регистрация: 07.06.2011
Сообщений: 28
По умолчанию Проблема с событиями при редактировании компонентов формы из кода

Написал статью про решение часто встречающейся проблемы с интерфейсом.

Суть проблемы в следующем: Если редактировать содержимое компонента из кода (например указать текущий выбранных элемент в ComboBox), то приходит событие об изменении содержимого, от этих компонентов. Событие конечно правильно приходит, вот только реагировать на него не нужно или иногда даже вредно. Так же подписка на события может привести к рекурсивному вызову функции, который переполняет стек.

Вот статья: http://itw66.ru/blog/c_sharp/559.html

Может быть есть более изящный способ решения проблемы?
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
FiloXSee вне форума Ответить с цитированием
Старый 02.12.2011, 17:35   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Мне кажется есть. Лично я, когда сталкивался с такой проблемой, делал так:
Вводил bool переменную, которая указывала стоит ли реагировать на событие или нет. В принципе такой подход требует введения 1-ой дополнительной переменной, нескольких if в обработчиках событий и установку данной переменной в нужных местах.
Попробую показать примером: допустим у нас есть компонент TextBox(имя txtBox), в котором хранится текст заголовка окна. Т.е. для этого TextBox есть обработчик OnTextChanged(). При запуске приложения мы программно устанавливаем какой-то текст:
Код:
MainForm()
{
...
txtBox.Text = this.Text;
...
}
В этот момент сработает наше событие, которое установит заголовок окна из txtBox:
Код:
this.Text = txtBox.Text;
Возникает проблема ненужной обработки события. Что делаем: вводим bool isInit - флаг указывающий на необходимость обработки:
Код:
...
bool isInit;
MainForm()
{
...
isInit = false;
txtBox.Text = this.Text;
isInit = true;
...
}
И добавляем проверку в обработчик:
Код:
if (isInit)
this.Text = txtBox.Text;
Тут я показал достаточно не затратный, по памяти и производительности пример, но в жизни это может быть что угодно(например, запрос в базу размером десятки гигабайт).
Hollander вне форума Ответить с цитированием
Старый 08.12.2011, 08:20   #3
FiloXSee
Пользователь
 
Регистрация: 07.06.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Hollander Посмотреть сообщение
Вводил bool переменную, которая указывала стоит ли реагировать на событие или нет.
Я тоже использовал подобный способ, однако из-за необходимости выходить из функций по return и генерируемых исключений есть вероятность, что переменная будет не корректно выставлена. В таком варианте нужно учитывать много случаев.

Именно, чтобы избежать подобных проблем я и пришел к способу, описанному в статье.

Мой вариант, предложенный в статье:
Цитата:
InterfaceLock.Lock( this, delegate()
{
txtBox.Text = this.Text;
} );
Портал "It Works" (http://itw66.ru), на котором веду множество блогов по программированию и философии (FiloXSee).
FiloXSee вне форума Ответить с цитированием
Старый 08.12.2011, 10:04   #4
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Цитата:
Сообщение от FiloXSee Посмотреть сообщение
однако из-за необходимости выходить из функций по return и генерируемых исключений есть вероятность, что переменная будет не корректно выставлена.
Не очень понял что тут за проблема. Поясни плиз.
Hollander вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при переносе кода. MasterK Общие вопросы Delphi 1 08.04.2010 18:05
Проблема с отображением формы и компонентов в режиме "RightToLeft" (RTL) NeonSimfi Win Api 0 04.05.2009 12:31
проблема при подключении компонентов parshik Компоненты Delphi 2 22.04.2009 22:13
Проблема при редактировании данных GloomyVitek БД в Delphi 8 24.11.2007 18:54