Ich benutze MDI ziemlich oft, ich mag es viel mehr (wo es verwendet werden kann) als mehrere schwebende Formen.
Aber um das Beste daraus zu machen, müssen Sie sich mit Ihren eigenen Ereignissen auseinandersetzen. Es macht dir das Leben so viel einfacher.
Ein Skelettbeispiel.
Haben Sie Ihre eigenen Interrupt-Typen,
//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
}
Dann dein eigener Args-Typ
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; }
}
Verwenden Sie dann den Delegaten in Ihrem Namespace, jedoch außerhalb einer Klasse
namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
public partial class Form1 : Form
{
//your main form
}
Lassen Sie den MDIparent jetzt entweder manuell oder über die GUI auf die Ereignisse der untergeordneten Formulare reagieren.
Aber mit Ihren eigenen Args können Sie dies auf eine einzige Funktion reduzieren. und Sie können Vorkehrungen treffen, um die Interrupts zu unterbrechen, gut zum Debuggen, aber auch auf andere Weise nützlich sein.
Lassen Sie einfach alle Ihre mdiparenten Ereigniscodes auf die eine Funktion verweisen.
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);
Ein einfacher Schaltmechanismus reicht normalerweise aus, um Ereignisse an geeignete Formulare weiterzuleiten.