There are a couple of ways to do this. Using .NET events is one but requires pretty coupled wiring.
What I would suggest (and this is how I do this) is to use your own bus (observer pattern). Let's call it MessageBus. All your forms could use the same instance of this bus and when something interesting happens you could publish some Message. I would keep it strongly typed but for the sake of simplicity let's say this:
public class Message<T>
{
public string Name { get; set; }
public T Data { get; set; }
}
You would then have subscribers on your bus that respond to messages that they are interested in.
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);
}
}
So to wire all this up each form that would like to publish an event (such as your form2) would need a reference to the message bus and each object that is interested in receiving events (such as form3) would register as a subscriber.
The only difference between this an using .NET events is that the various publishers and subscribers do not need to know about each other so they are loosely coupled --- they only need to know about the bus. It is possible to get the same loose coupling using .NET events but that takes a lot of fancy footwork.
More than one way to skin a cat I suppose.
I have a more mature implementation of this in my composite ui framework I use for the tooling on our FOSS service bus. You can take a look if you are interested:
Shuttle Service Bus on CodePlex
If you download the source you will find it in the Shuttle.Core.UI project.
Hope it makes sense.