GetNextControlは、SplitContainerの中のコントロールを取得できない

http://metroit.hatenablog.jp/entry/2016/04/05/164544
System.Windows.Forms.Control.GetNextControlメソッドは、Panelの中のコントロールは取得できるくせにSplitContainerの中のコントロールは取得できない。
これに限らずSplitContainerが色々標準的なうごきをぶち壊す挙動をしてくれるので、気軽に使わないほうがいいな……。便利ではあるんだが。



以下コードではSplitContainerの中のコントロールに対して処理を行えない。

Dim oCtrl = Me.GetNextControl(Nothing, True)
Do While oCtrl IsNot Nothing

    ' 何かの処理

    oCtrl = Me.GetNextControl(oCtrl, True)
Loop

対策版は以下。

Dim oAllCtrls = Me.GetAllControl(Me)
For Each oCtrl In oAllCtrls
    ' 何かの処理
Next

''' <summary>
''' SplitContainerの中も含めた全コントロールを取得
''' </summary>
''' <param name="oParentCtrl">親コントロール</param>
''' <returns>全コントロール</returns>
Private Function GetAllControl(oParentCtrl As Control) As HashSet(Of Control)
    Dim oAllCtrls = New HashSet(Of Control) ' 重複なしコレクション

    Dim oCtrl = oParentCtrl.GetNextControl(Nothing, True)
    Do While oCtrl IsNot Nothing
        oAllCtrls.Add(oCtrl)

        If oCtrl.Controls.Count > 0 Then
            Dim oInnerCtrls = Me.GetAllControl(oCtrl)
            For Each oInnerCtrl In oInnerCtrls
                oAllCtrls.Add(oInnerCtrl)
            Next
        End If

        oCtrl = oParentCtrl.GetNextControl(oCtrl, True)
    Loop

    Return oAllCtrls

End Function