none
TreeViewでディレクトリ階層の表示の仕方について RRS feed

  • 質問

  • 環境 OS:Windows10 言語: Visual Basic 2013 TreeViewでディレクトリ表示を行うことを試行しています。
    いろいろな人のソース参考にして
     表示までしましたが・・・・

    ディレクトリ階層によって表示されるまで 重くなり、
    動かなくなるのでどう回避したらいいのか教えてほしいです。

    -----ソース------

    Public Class Form1

        Sub Button1_Click() Handles Button1.Click
            Dim sFolder As String = ”c:¥”
            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

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

    2020年9月21日 5:43

すべての返信

  • 全部列挙するのではなく、登録するのは子階層までにしておきます。

    ノードが展開されたら、それを BeforeExpand イベントで拾って、その展開されたノードだけ、さらに子階層迄辿るようにします。

    下記はレジストリをツリー表示する場合の実装例ですが、ディレクトリ階層に対しても応用できるかと。

    2020年9月21日 6:22
  • philkittyさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    TreeViewでディレクトリを表示するために、以下のコードが参考になるかもしれません。
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
            Dim directoryInfo As DirectoryInfo = New DirectoryInfo("D:\TestFile2\")
            If directoryInfo.Exists Then
                BuildTree(directoryInfo, TreeView1.Nodes)
            End If
        End Sub
        Private Sub BuildTree(ByVal directoryInfo As DirectoryInfo, ByVal addInMe As TreeNodeCollection)
            Dim curNode As TreeNode = addInMe.Add(directoryInfo.Name)
            For Each file As FileInfo In directoryInfo.GetFiles()
                curNode.Nodes.Add(file.FullName, file.Name)
            Next
            For Each subdir As DirectoryInfo In directoryInfo.GetDirectories()
                BuildTree(subdir, curNode.Nodes)
            Next
        End Sub
    結果:


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年9月25日 7:17
    モデレータ
  • 参考のソースをありがとうございます。
    ただ、教えていただいたソースと私が記載したソースは、少し文法が違うだけで同じ処理だったので
    あまり参考になってないです。すみません。

    魔界の仮面弁士さんの指摘したBeforeExpand イベントで、TreeViewを使うといいとアドバイスをいただいたのですが、さっぱり良く分からない状態です。

    もし、BeforeExpand イベントの簡易的な参考となるソースがあれば、あれば押してください。


    2020年9月28日 6:26
  • こんな感じで。

    Imports System.IO
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            For Each drv In DriveInfo.GetDrives()
                Dim rootName = drv.VolumeLabel
                If String.IsNullOrWhiteSpace(rootName) Then
                    rootName = drv.DriveType.ToString()
                End If
                Dim n = TreeView1.Nodes.Add(drv.Name, rootName & " (" & drv.Name & ")")
                If drv.IsReady AndAlso Directory.EnumerateDirectories(drv.Name).Any() Then
                    n.Nodes.Add(vbTab, "philkitty")
                End If
            Next
        End Sub
    
        Private Sub TreeView1_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
            If e.Node.Nodes.Count = 1 AndAlso e.Node.Nodes(0).Name = vbTab Then
                Dim nodes = e.Node.Nodes
                nodes.Clear()
                Try
                    Dim di As New DirectoryInfo(e.Node.Name)
                    For Each d In di.EnumerateDirectories()
                        Dim n = nodes.Add(d.FullName, d.Name)
                        If d.Attributes.HasFlag(FileAttributes.Hidden) Then
                            n.ForeColor = Color.Gray
                        End If
                        Try
                            If d.EnumerateDirectories().Any() Then
                                n.Nodes.Add(vbTab, "philkitty")
                            End If
                        Catch
                        End Try
                    Next
                Catch
                End Try
            End If
        End Sub
    End Class


    2020年9月28日 7:39