Есть несколько способов сделать это.Использование событий .NET - это одно, но требует довольно связанной проводки.
Что я хотел бы предложить (и именно так я это делаю), так это использовать собственную шину (шаблон наблюдателя).Давайте назовем это MessageBus.Все ваши формы могут использовать один и тот же экземпляр этой шины, и когда происходит что-то интересное, вы можете опубликовать какое-нибудь Сообщение.Я бы держал его строго напечатанным, но для простоты скажем так:
public class Message<T>
{
public string Name { get; set; }
public T Data { get; set; }
}
В вашем автобусе будут подписчики, которые будут отвечать на сообщения, которые их интересуют.
public class MessageBus
{
public void Subscriber(ISubscriber subsriber)
{
// register your subscriber in some list
}
public void Publish(Message message)
{
// loop through subscribers and let them know
// e.g. subscriber.Handle(message);
}
}
Таким образом, чтобы связать все это, каждая форма, которая хотела бы опубликовать событие (например, ваша форма2), нуждалась бы в ссылке на шину сообщений, и каждый объект, который заинтересован в получении событий (например, форма 3), зарегистрировался бы как подписчик..
Единственное отличие между использованием событий .NET заключается в том, что различным издателям и подписчикам не нужно знать друг о друге, поэтому они слабо связаны - им нужно только знать о шине.Можно получить ту же слабую связь, используя события .NET, но это требует много усилий.
Я полагаю, что существует более одного способа снятия шкуры с кошки.
У меня есть более зрелыйРеализация этого в моей композитной среде пользовательского интерфейса я использую для инструментов на нашей сервисной шине FOSS.Если вам интересно, вы можете посмотреть:
Шинный сервисный автобус на CodePlex
Если вы скачаете исходный код, вы найдете его в проекте Shuttle.Core.UI.
Надеюсь, это имеет смысл.