以前の記事「【VB.NET】MDIのアプリケーションを作成する」でMDIフォームの作成について説明した。
今回は、親フォームを閉じる時の注意点について説明する。

【子フォームが表示されていない場合】
・通常のフォーム(MDI以外のフォーム)と同じ。
 (特に考慮する必要はない)

【子フォームが表示されている場合】
・子フォームのClosingイベント、及び、Closedイベントが先に実行される。
・子フォームのClosingイベントで「e.Cancel = True」となった場合、親フォームのe.CancelがTrueとなる。
 →親フォームが閉じるのをキャンセルする。

上記を考慮してプログラムを作成する必要がある。

サンプルのソリューションは、こちら(MDISample2.zip)からダウンロードできます。
(VB2005で作成しています)

以下、サンプルの説明。
1.子フォーム(SubForm)クラスにイベントを追加
 Public Class SubForm
    :
   (中略)
    :
  '子フォームを閉じかどうか確認する
  Private Sub SubForm_Closing(ByVal sender As Object, _
   ByVal e As System.ComponentModel.CancelEventArgs) _
   Handles MyBase.Closing

   If MessageBox.Show("閉じてもよろしいですか?", "確認", _
    MessageBoxButtons.YesNo) <> _
    Windows.Forms.DialogResult.Yes Then

    e.Cancel = True
   End If
  End Sub
 End Class

2.親フォーム(ContainerForm)クラスにイベントを追加 
 Public Class MDIContainerForm
  Private Sub MDIContainerForm_Closing(ByVal sender As Object, _
   ByVal e As System.ComponentModel.CancelEventArgs) _
   Handles MyBase.Closing

   '強制的に終了する場合には、以下の処理を有効化する
   'e.Cancel = False
  End Sub
 End Class

【補足事項】
・イベントの発生順序は、以下の通り。
 1.子フォームのClosingイベント
 2.子フォームのClosedイベント
 3.親フォームのClosingイベント
 4.親フォームのClosedイベント
・親フォームのClosingイベントは必ず発生する。
・子フォームのClosingイベントで閉じるのをキャンセルした場合、親フォームを閉じるのもキャンセルされる。
・親フォームを閉じた場合に強制的にフォームを閉じる場合する方法は、以下の通り。
 親フォームのClosingイベントで「e.Cansel = False」とする。
 (子フォームのイベントが全て完了してから実行されるので、親フォームのイベントで強制的に上書きすれば良い)
 ※サンプルでは、コメント化しているので、確認する場合は有効化すること。