私は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
}
次に、手動またはGUIを使用して、MDIparentが子フォームのイベントに応答するようにします。
しかし、独自のArgsを使用すると、これを単一の関数に減らすことができます。そして、あなたは中断に干渉する準備をすることができ、デバッグには良いですが、他の点でも有用であるかもしれません。
mdiparentイベントコードのすべてに1つの関数を指定させるだけです。
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);
通常、イベントを適切なフォームに渡すには、単純な切り替えメカニズムで十分です。