Uso bastante MDI, me gusta mucho más (donde se puede usar) que múltiples formas flotantes.
Pero para obtener lo mejor de ti, debes familiarizarte con tus propios eventos. Te hace la vida mucho más fácil.
Un ejemplo esquelético.
Ten tus propios tipos de interrupción,
//Clock, Stock and Accoubts represent the actual forms in
//the MDI application. When I have multiple copies of a form
//I also give them an ID, at the time they are created, then
//include that ID in the Args class.
public enum InteruptSource
{
IS_CLOCK = 0, IS_STOCKS, IS_ACCOUNTS
}
//This particular event type is time based,
//but you can add others to it, such as document
//based.
public enum EVInterupts
{
CI_NEWDAY = 0, CI_NEWMONTH, CI_NEWYEAR, CI_PAYDAY, CI_STOCKPAYOUT,
CI_STOCKIN, DO_NEWEMAIL, DO_SAVETOARCHIVE
}
Entonces tu propio tipo Args
public class ControlArgs
{
//MDI form source
public InteruptSource source { get; set; }
//Interrupt type
public EVInterupts clockInt { get; set; }
//in this case only a date is needed
//but normally I include optional data (as if a C UNION type)
//the form that responds to the event decides if
//the data is for it.
public DateTime date { get; set; }
//CI_STOCKIN
public StockClass inStock { get; set; }
}
Luego use el delegado dentro de su espacio de nombres, pero fuera de una clase
namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
public partial class Form1 : Form
{
//your main form
}
Ahora, ya sea manualmente o utilizando la GUI, haga que el MDIparent responda a los eventos de los formularios secundarios.
Pero con su propio Args, puede reducir esto a una sola función. y puede tener una disposición para interrumpir las interrupciones, lo que es bueno para la depuración, pero también puede ser útil de otras maneras.
Simplemente haga que todos sus códigos de eventos mdiparent apunten a la única función,
calendar.Friday += new StoreHandler(MyEvents);
calendar.Saturday += new StoreHandler(MyEvents);
calendar.Sunday += new StoreHandler(MyEvents);
calendar.PayDay += new StoreHandler(MyEvents);
calendar.NewYear += new StoreHandler(MyEvents);
Un mecanismo de cambio simple suele ser suficiente para pasar eventos a los formularios apropiados.