Windows forms: подключение пользовательских событий между элементами управления, добавленными во время выполнения

#c# #winforms #events #user-interface

#c# #winforms #Мероприятия #пользовательский интерфейс

Вопрос:

Если у меня есть следующая форма:
Скриншот здесь

Форма имеет несколько пользовательских элементов управления (оранжевый), которые также содержат несколько пользовательских элементов управления (зеленый).

Мои вопросы:
1) Если я добавлю дополнительный «зеленый» пользовательский элемент управления к одному из «оранжевых» пользовательских элементов управления, каков наилучший способ подключить этот новый «зеленый» пользовательский элемент управления к событию кнопки в основной форме (без «оранжевого» или «зеленого» пользовательского элемента управления, знающего об основной форме)?
Я думал запустить событие из ‘orange’ usercontrol в основную форму с ‘green’ usercontrol в качестве параметра, а затем обработать подключение в основной форме.

2) Есть ли более подходящие «места» для обработки этого подключения?

3) Если все «зеленые» пользовательские элементы управления должны подключаться к событию друг друга (например, если значение изменяется в одном из них, все остальные должны быть проинформированы), каков наилучший способ? Я думал о создании одноэлементного класса EventManager для обработки этого?

Я действительно борюсь с комбинацией слабо связанных пользовательских элементов управления и их подключением.

Я надеюсь, что мой вопрос ясен.

Заранее спасибо, Кевин

Комментарии:

1. AVG сказал мне, что в вашей ссылке imageshack что-то не так. Я уверен, что это не твоя вина, но, чувак, будь осторожен. Ложный результат?

Ответ №1:

Вот как я думаю об этом, любой элемент управления / класс должен отвечать за настройку самого себя и общедоступного интерфейса своих непосредственных дочерних элементов. Пользователю класса или элемента управления не должны требоваться какие-либо знания об этом родительском элементе или какие-либо внутренние знания о его дочерних элементах.

Итак, в вашем примере оранжевые элементы управления должны подписываться на события зеленых элементов управления и действовать соответствующим образом, возможно, вызывая свое собственное событие для родительского элемента управления и или, возможно, изменяя какое-либо поле для родственного элемента управления зеленого цвета. Когда зеленые элементы управления добавляются и удаляются из оранжевого, оранжевый элемент управления отвечает за поддержание своей внутренней «проводки». Это верно, независимо от того, произошло ли это в общедоступном или частном методе на orange, если хост способен выполнять это через некоторую доступную коллекцию на orange, логика для этого должна быть инкапсулирована в orange.

Это утверждение одинаково верно, рассматриваем ли мы оранжевый, хост, зеленый или любой другой класс / элемент управления.

С точки зрения кодирования вы захотите использовать = и -= с моделью многоадресного делегирования подписка на события при добавлении и удалении элементов управления. Обработчики будут закодированы соответствующим образом.

Комментарии:

1. Итак, если я правильно понимаю, я должен создать событие valueChanged в green и orange usercontrols и разрешить основной форме подписаться на событие valueChanged в orange, а orange — на событие valueChanged в green. <br> Как только значение в зеленом цвете изменится, orange будет проинформирован, а затем сможет вызвать его событие valueChanged в основной форме?<br<br> Как только это произойдет, каков наилучший способ сообщить другим пользовательским элементам управления orange? Напрямую через общедоступный метод или также через events. (Во втором случае, где я должен выполнить это подключение? Передайте mainform в orange, чтобы orange мог подключаться сам?) Спасибо