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