Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25

Проблема событий при редактировании компонентов формы из кода

02.12.2011, 15:10. Показов 1199. Ответов 5
Метки нет (Все метки)

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

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

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

Может быть есть более изящный способ решения проблемы?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2011, 15:10
Ответы с готовыми решениями:

При редактировании формы выбираю значение, а в MySQL уходит NULL
Приветствую! Есть таблица контрагентов: Если нажимаю на редактировать, то перехожу в форму, которая корректно вносит изменения,...

запись кода в процедуру обработки событий свойства поля формы в VB ACCESS
есть форма состоящая из 2 полей и кнопке ок: 1 поле последняя дата, должна читаться из таблицы базы данных; 2 поле мы вводим новую...

Обработка 2х событий при отправке формы
Здравствуйте. Имеется следующая проблема в задаче. При нажатии на клавишу в окне браузера открывается вспомогательное окно с формой для...

5
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
02.12.2011, 15:30
Решение - отписываться от обработчиков событий соответствующих...
Если изменяешь значение программно, то в любом случае знаешь что в это время подписан на то или иное событие, которое будет вызвано изменением.

Добавлено через 2 минуты
При разработке своего компонента всегда есть возможность изменять значение не в свойстве, которое обычно и завязано на событие, а непосредственно в поле, в котором хранится значение, возвращаемое свойством.
0
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25
02.12.2011, 15:56  [ТС]
Этот вариант так же плох тем, что затрудняет читаемость кода. Кроме того легко забыть или не верно зарефакторить обратную подписку на событие. Например добавить return в функцию, не подумав о событиях. Такие ошибки очень сложно заметить и искать.
0
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
02.12.2011, 16:17
Думать, честно говоря, тоже сложно порой... Но использовать lock, который для синхронизации потоков используется...
0
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25
02.12.2011, 17:00  [ТС]
Цитата Сообщение от SpawnDDR Посмотреть сообщение
Думать, честно говоря, тоже сложно порой... Но использовать lock, который для синхронизации потоков используется...
Вот я и предлагаю в статье решение, которое минимизирует возможные проблемы при рефакторинге (сложно испортить) и которое не вызывает функцию lock для всего кода (только для внутренней работы). lock нужен только если будет работа с интерфейсом из другого потока. Если ее заведомо не будет, то можно не лочить.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.12.2011, 02:00
Вы меня извините за прямоту, но что-то вы перемудрили в статье.
Сначала создали кривую реализацию привязки данных, а потом написали костыль, ее "исправляющий".
Привяжите по-нормальному через DataBindings значение Value элемента управления к свойству объекта и будет вам счастье.
Если привязку делать не хочется, то подписывайтесь на события после вызова метода Init, чтобы избежать рекурсивного вызова обработчика.
Если позднюю подписку делать тоже не хочется, то сделайте свой обработчик для каждого контрола (как и должно быть по уму при не использовании привязки).

Не по теме:

Порадовала вот эта строчка:

C#
1
null == lockObj
Это называется Yoda Conditioning :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2011, 02:00
Помогаю со студенческими работами здесь

Масштабирование компонентов при максимизации формы
Как сделать что бы когда устанавливаю WindowState "Maximized" увеличивалось не только окно но и все кнопки что на нём находятся.

Позиция компонентов при растягивании формы
Добрый день! Задача, вероятно, простая, но я еще не могу ее решить сам. Дело в том что при превязке Anchor'ами компонентов формы ко...

Изменение размеров компонентов при ресайзе формы
Добрый день. Использую WinForms в приложении. Возникла проблема: при разворачивании формы компоненты остаются на своих местах, т.е. имеют...

Масштабирование компонентов при изменении размеров формы
На форме есть следующие компоненты: Image, StringGrid, BitBtn (3 штуки), ComboBox (2 штуки). Есть какие-то свойства (что-нибудь), чтобы эти...

Как сократить код при перечислении компонентов формы
Как сократить запись при перечисление компонентов формы. Есть такой код допустим Form1.pictureBox2.Visible = true; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru