以前の記事「【VB.NET】MDIのアプリケーションを作成する」に関連した情報であるが、MDIで親フォームにコントロールを設置し、全ての子フォームが閉じた場合に親フォームのコントロールにフォーカスを移す方法について説明する。
サンプルのソリューションは、こちら(MDISample3.zip)からダウンロードできます。
(VB2005で作成しています)

以下、サンプルの説明。
1.GlobalModuleの追加
 Module GlobalModule
  '子フォームの個数管理用変数の宣言
  '親フォームや子フォームのクラスに宣言しても構わない

  Public ChildFormCount As Integer
 End Module

2.子フォーム(SubForm)クラスにイベントを追加
 Public Class SubForm
    :
   (中略)
    :
  '子フォームを閉じる時に子フォームの個数を1減算する
  Private Sub SubForm_Closed(ByVal sender As Object, _
   ByVal e As System.EventArgs) Handles MyBase.Closed

   ChildFormCount -= 1
  End Sub

  '子フォームを閉じかどうか確認する
  'Private Sub SubForm_Closing(ByVal sender As Object, _
  ' ByVal e As System.ComponentModel.CancelEventArgs) _
  ' Handles MyBase.Closing
  '
  ' If MessageBox.Show("閉じてもよろしいですか?", _
  '   "確認", MessageBoxButtons.YesNo) _
  '   <> DialogResult.Yes Then
  '
  '  e.Cancel = True
  ' End If
  'End Sub

 End Class

3.親フォーム(ContainerForm)にボタンを配置する。
 コントロール名:Button1

4.親フォーム(ContainerForm)クラスにイベントを追加 
 Public Class ContainerForm
  '子フォームの新規作成
  Private Sub NewMItem_Click(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles NewMItem.Click

   Try
    Dim Frm As New SubForm
    Frm.MdiParent = Me
    'フォームを表示する前に子フォームの個数を1加算する
    ChildFormCount += 1
    Frm.Show()
    Frm.Text = "Sub Form" & Me.MdiChildren.Length
    Me.LayoutMdi(MdiLayout.TileHorizontal)
   Catch ex As Exception
    MessageBox.Show(ex.Message, "エラー")
   End Try
  End Sub

  'FormLoadイベント
  Private Sub ContainerForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   SelMItem = CascadeMItem
   CheckMItem()
   '子フォームの個数を初期化
   ChildFormCount = 0
  End Sub

  'GotFocusイベント
  Private Sub ContainerForm_GotFocus(ByVal sender As Object, _
   ByVal e As System.EventArgs) Handles MyBase.GotFocus

   '子フォームが1つもなければ、親フォームのTextBox1にフォーカスを当てる
   If ChildFormCount <= 0 Then
    Me.Button1.Focus()
   End If
  End Sub
 End Class
  
【補足事項】
・子フォームを閉じた場合のイベントの発生順序は、以下の通り。
  1.子フォームのClosingイベント
  2.子フォームのClosedイベント
  3.子フォームのDisposeイベント
  4.子フォームのVisibleChangedイベント
  5.子フォームのLostFocusイベント
  6.親フォームのGotFocusイベント
  7.子フォームのGotFocusイベント
  8.子フォームのDeactivateイベント
  9.親フォームのMdiChildActivateイベント
 10.子フォームのLostFocusイベント
 11.親フォームのGotFocusイベント
 12.子フォームのHandleDestroyedイベント
※上記は、関連しそうなイベントの発生順序を確認したものである。
 そのため、他のイベントが発生する可能性がある点に注意すること!

・フォームのMdiChildActivateイベントは、以下の場合に発生する。
 1.MDIの子フォームがアクティブになった場合
 2.MDIの子フォームが閉じた場合
・MdiChildrenプロパティの増減のタイミングは、以下の通り。
  増加 … 子フォームのインスタンス生成時
  減少 … 子フォームのインスタンス破棄時(子フォームのHandleDestroyedイベント実行時)
・子フォームが全て閉じた場合に何らかの制御を行う場合には、独自に子フォームの個数を管理する必要がある。
 →サンプルでは、ChildFormCountがこれに該当する。
・独自の子フォームの個数管理のタイミングは、以下の通り。
  増加 … 子フォームのインスタンス生成時
  減少 … 子フォームのCloseイベント発生時(閉じることが確定した時点)
・子フォームのClosingイベントで閉じるのをキャンセルした場合は、個数はそのままとなる。
 (サンプルでは、コメント化してあるので、有効行にすれば試すことができる)
・最後に実行される親フォームのGotFocusイベントでコントロールにフォーカスを設定する必要がある。
 →上記のイベント発生タイミングの11以降でフォーカスを設定しないと、親フォームにフォーカスが設定されてしまう。

この方法では、GotFocusイベントに記述した処理が2回実行されてしまうため、すっきりした方法ではない。
もう少し、すっきりした方法があるのかもしれない…

(別のイベントに記述するとか、別のクラスを利用するとか…)