Я довольно часто использую MDI, мне он нравится гораздо больше (где его можно использовать), чем несколько плавающих форм.
Но чтобы извлечь из этого максимум, нужно разобраться со своими собственными событиями.,Это делает жизнь намного проще для вас.
Пример скелета.
Есть ваши собственные типы прерываний,
//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
}
Тогда ваш собственный тип 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; }
}
Затем используйте делегата в вашем пространстве имен, но вне класса
namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
public partial class Form1 : Form
{
//your main form
}
Теперь, либо вручную, либо с помощью графического интерфейса, MDIparent должен реагировать на события дочерних форм.
Но с помощью вашего Args вы можете свести это к одной функции.и вы можете иметь возможность прерывать прерывания, что хорошо для отладки, но может быть полезным и для других способов.
Просто укажите, чтобы все ваши коды событий mdiparent указывали на одну функцию,
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);
Обычно достаточно простого механизма переключения для передачи событий в соответствующие формы.