再帰的関数のすすめ
再帰関数が一発で決まると快感よね。
①TreeViewでエクスプローラー
''' <summary> ''' 対象フォルダを読み込み中身をツリービューに表示する ''' </summary> ''' <param name="avTargetTrv">対象ツリービューコントロール</param> ''' <param name="avTargetDir">対象フォルダ</param> ''' <param name="avParentNode">追加先ノード。未指定の場合ツリービューにノード新規作成</param> Public Sub ReadDirToTree(ByVal avTargetTrv As TreeView, ByVal avTargetDir As String, Optional ByVal avParentNode As TreeNode = Nothing) Try '親フォルダをツリービューに追加 If IsNothing(avParentNode) Then '親ノード指定なし avParentNode = avTargetTrv.Nodes.Add("", GetDirName(avTargetDir)) Else '親ノード指定あり avParentNode = avParentNode.Nodes.Add("", GetDirName(avTargetDir)) End If '親ノードタグにフォルダパスをセット avParentNode.Tag = avTargetDir 'フォルダを取得 Dim rvDirs As New List(Of String) rvDirs.AddRange(IO.Directory.GetDirectories(avTargetDir, "*", IO.SearchOption.TopDirectoryOnly)) '子フォルダがあった場合、再帰的にmsReadDirをコールする For I As Integer = 0 To rvDirs.Count - 1 ReadDirToTree(avTargetTrv, rvDirs(I), avParentNode) Next ''ファイルを取得 Dim rvFiles As New List(Of String) rvFiles.AddRange(IO.Directory.GetFiles(avTargetDir, "*", IO.SearchOption.TopDirectoryOnly)) 'ファイル数分ノードを追加 For I As Integer = 0 To rvFiles.Count - 1 avParentNode.Nodes.Add("", IO.Path.GetFileName(rvFiles(I))).Tag = rvFiles(I) Next Catch ex As Exception Throw ex End Try End Sub ''' <summary> ''' 終端フォルダ名の取得 ''' </summary> ''' <param name="avTarget"></param> ''' <returns></returns> Private Function GetDirName(ByVal avTarget As String) As String Dim rvRep As String = "" Try Dim rvSplit As String() = Split(avTarget, "\") rvRep = rvSplit(rvSplit.Length - 1) Catch ex As Exception MsgBox(ex.Message) Finally GetDirName = rvRep End Try End Function
②Treeviewの全ノードを文字列検索
''' <summary> ''' 全ノードの検索処理 ''' </summary> ''' <param name="avTargetTrv"></param> ''' <param name="avFindStr"></param> Private Sub AllNodeSearch(ByVal avTargetTrv As TreeView, ByVal avFindStr As String) Try If String.IsNullOrEmpty(avFindStr) = False Then Cursor = Cursors.WaitCursor avTargetTrv.SuspendLayout() '全ノードを検索 For Each node As TreeNode In avTargetTrv.Nodes SearchNodes(avFindStr, node) Next End If Catch ex As Exception MsgBox(ex.Message) Finally avTargetTrv.ResumeLayout() Cursor = Cursors.Default End Try End Sub ''' <summary> ''' 対象ノードに検索文字列が含まれているかチェック ''' </summary> ''' <param name="avFindStr"></param> ''' <param name="avTargetNode"></param> Private Sub SearchNodes(ByVal avFindStr As String, ByVal avTargetNode As TreeNode) Try If InStr(avTargetNode.Text, (Trim(avFindStr)), CompareMethod.Text) > 0 Then '検索文字列に引っかかったら背景色を黄色にする avTargetNode.BackColor = Color.Yellow Else '背景色を戻す avTargetNode.BackColor = Nothing End If '子ノードがあれば再帰的に呼び出し For Each childNode As TreeNode In avTargetNode.Nodes SearchNodes(avFindStr, childNode) Next Catch ex As Exception Throw ex End Try End Sub