フォームの表示切替
フォームの表示方法でShowDialog(Show)メソッドによって実現していますが、Form1を閉じてForm2を開くような画面変遷を兼ねている場合、呼び出し元であるForm1を閉じずにHideメソッドで隠しておく必要があります。
Form2 f = new Form2(); f.Show(); this.Hide();
問題はForm2を閉じる時、再度Form1を開く作業が必要であるということです。また、不意にForm1を開く前にForm2が閉じてしまうと、アプリケーションが終了せずプロセスに残り続ける状態になってしまいます。
これを簡単に回避するには、メインフォームを切り替える方法があります。
Form1がメインフォームの場合は、Form2を閉じてもForm1を閉じない限りアプリケーションは終了しませんし、Form2が開いた状態でもForm1を閉じると全てのフォームが終了してアプリケーションが終了します。
メインフォームをForm2へ切り替えれば、Form1を閉じてもアプリケーションが終了することはありません。
そもそもWindowsフォームアプリケーションは、エントリポイントでApplication.Runに指定されたフォームが閉じられるとアプケーションが終了する仕組みになっています。これをApplicationContextに変更してあげると、ApplicationContextのMainFormプロパティに設定されたフォームが閉じたときにアプリケーションが終了するようになります。
つまり、MainFormプロパティをフォームを開く前に変更してあげれば、メインフォームを移動することができ、安全に呼び出し元のフォームを閉じることが可能となります。
まず、エントリポイントを以下の様に変更します。
public static ApplicationContext mainFormContext; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); mainFormContext = new ApplicationContext(); mainFormContext.MainForm = new Form1(); Application.Run(mainFormContext); }
Public mainFormContext As ApplicationContext <STAThread()> Sub Main() Application.EnableVisualStyles() Application.SetCompatibleTextRenderingDefault(False) mainFormContext = New ApplicationContext mainFormContext.MainForm = New Fomr1 Application.Run(mainFormContext) End Sub
これによってForm1がApplicationContextクラスのメインフォームとなりました。
後は、フォームを切り替える時にApplicationContextクラスのメインフォームを置き換える処理を入れます。
mainFormContext.MainForm = new Form2(); mainFormContext.MainForm.Show(); this.Close();
mainFormContext.MainForm = New Form2 mainFormContext.MainForm.Show() Me.Close()
一方通行のような場合はこの方法が有用で、各インスタンスの管理をする必要もなくなります。