tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルTreeViewでの子ノード追加の方法
記事No8487
投稿日: 2008/12/21(Sun) 02:03
投稿者のぶ
いつも参考にさせてもらっています。

1回の処理ですべてのフォルダ構成をTreeViewで表示させたいのですが、どうしても
親→子→子→ に表示できず、 親→子 でストップししまいすべてのサブフォルダが
1つ目の子配下に表示されてしまいます。

ロジックはこんな感じです。

   getsubfolders(sFolder, e)    

    Public Sub getsubfolders(ByVal folderName As String, ByVal ee As System.Windows.Forms.TreeViewEventArgs)

         Dim NodeIN As TreeNode
        For Each sName In My.Computer.FileSystem.GetDirectories(folderName)
            NodeIN = New TreeNode(sName, ItemImage.imageFolderC, ItemImage.imageFolderO)
            ee.Node.Nodes.Add(NodeIN)

            getsubfolders(sName, ee) '--- 子の子調査

        Next

    End Sub

だれか知識がある方がいらっしゃいましたら、助けてください。
よろしくお願いします(>_<)

[ツリー表示へ]
タイトルRe: TreeViewでの子ノード追加の方法
記事No8488
投稿日: 2008/12/21(Sun) 08:54
投稿者
こんにちは。

コードをぱっと見た感じだと、
サブフォルダ名の取得まではうまくいってそうですが

>  ee.Node.Nodes.Add(NodeIN)
これが原因ですかね。
Nodeを全てTreeViewのNodes(親ノード)に追加してしまっています。

子ノードのNodesにNodeを追加したい場合は例えば

TreeView1.Nodes(0).Nodes.Add(NodeIN)

のように子ノードのNodesに追加すればOKかと思います。

[ツリー表示へ]
タイトルRe^2: TreeViewでの子ノード追加の方法
記事No8492
投稿日: 2008/12/23(Tue) 01:13
投稿者のぶ
丁寧な解説ありがとうございます。

早速試して、うまくできたんですが、問題が・・・

今、こんな具合に記述しているんですが、これだと

                For Each sName In My.Computer.FileSystem.GetDirectories(sFolder)

                    NodeIN = New TreeNode(sName, ItemImage.imageFolderC, ItemImage.imageFolderO)

                    TreeView2.Nodes(1).Nodes.Add(NodeIN)

                    For Each sName2 In My.Computer.FileSystem.GetDirectories(sName)
                        NodeIN = New TreeNode(sName2, ItemImage.imageFolderC, ItemImage.imageFolderO)
                        TreeView2.Nodes(1).Nodes(NodeIndex).Nodes.Add(NodeIN)
                    Next
                    NodeIndex = NodeIndex + 1

                Next


上記の場合、サブディレクトリが何階層になっていて、それ毎に
ノードを追加しようとすると


TreeView2.Nodes(NodeIndex0).Nodes(NodeIndex1).Nodes(NodeIndex2)…

このようにどんどんロジックが増えてしまうのですが…
なんとか簡単にすることはできないでしょうか?
よろしくお願いします m(_ _)m

[ツリー表示へ]
タイトルRe^3: TreeViewでの子ノード追加の方法
記事No8493
投稿日: 2008/12/23(Tue) 02:58
投稿者魔界の仮面弁士
再帰的に

Sub AddNode(ByVal Nodes As TreeNodeCollection, ByVal sFolder As String)
  Dim N As TreeNode = Nodes.Add(sFolder)
  For Each sName In My.Computer.FileSystem.GetDirectories(sFolder)
     AddNode(N.Nodes, sName)
  Next
End Sub

などと呼び出せば良いのではないかと。

ただ、GetDirectoryName の結果を単純に追加するだけだと、
各階層ごとにフルパスが指定されてしまい、鬱陶しい気が…。


ということで、Path.GetFileName でディレクトリ名だけ切り出してみたサンプル。
環境が書かれていなかったので、現行バージョン(VB2008)で記述しています。


Public Class Form1
    Sub Button1_Click() Handles Button1.Click
        Dim sFolder As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments
        TreeView1.ShowNodeToolTips = True
        TreeView1.BeginUpdate()
        TreeView1.Nodes.Clear()
        AddNode(TreeView1.Nodes, sFolder)
        TreeView1.EndUpdate()
    End Sub

    Sub AddNode(ByVal Nodes As TreeNodeCollection, ByVal sFolder As String)
        Dim N = Nodes.Add(System.IO.Path.GetFileName(sFolder))
        Try
            For Each sName In My.Computer.FileSystem.GetDirectories(sFolder)
                AddNode(N.Nodes, sName)
            Next
        Catch ex As UnauthorizedAccessException
            N.ToolTipText = ex.Message
            N.ForeColor = Color.Red
        End Try
        N.EnsureVisible()
    End Sub
End Class

[ツリー表示へ]
タイトルRe^4: TreeViewでの子ノード追加の方法
記事No8494
投稿日: 2008/12/23(Tue) 21:11
投稿者のぶ
返信ありがとうございました。

うまく教えて下さったロジックを追加したらできました。

初心者で再帰的にやるやり方がわからなくて困っていました。
ありがとうございました。

[ツリー表示へ]