从List <directoryinfo>重建树视图

时间:2016-02-08 11:36:51

标签: c# list treeview directoryinfo

我有一个函数Ge​​tDirectories(),它返回目录信息列表:现在我需要根据它的父元素重构树视图

以下是我的函数Getdirectories,它返回List

public List<DirectoryInfo> GetDirectories() 
    {
        DirectoryInfo di = new DirectoryInfo("D:\\python_code");
        folders.Clear();
        FullDirList(di, "*");
        return folders;
    }
 static List<DirectoryInfo> folders = new List<DirectoryInfo>(); // List that hold direcotries that cannot be accessed
 static void GetFullDirList(DirectoryInfo dir, string searchPattern)
    {
        try
        {
            foreach (FileInfo f in dir.GetFiles(searchPattern))
            {
                files.Add(f);
            }
        }
        catch
        {
        }

        foreach (DirectoryInfo d in dir.GetDirectories())
        {
            folders.Add(d);
            FullDirList(d, searchPattern);
        }

    }

我需要从List构造这样的东西,它包含所有的DirectoryInfo元素,即它也包含它的父信息。

Tree View of List<DirectoryInfo>

到目前为止,我正在尝试获取其父级相同的元素并将其填充到树视图并以递归方式执行: 但是我无法通过写入递归函数。

我知道他们有其他更简单的方法来做同样的事情,但这是我想要画的一幅大图。 任何帮助都会极为乐观。

1 个答案:

答案 0 :(得分:1)

假设您有WinForms树视图,您可以使用Find集合上的Nodes方法的键参数来构建层次结构。你不需要递归。这是Add方法:

    void Add(DirectoryInfo di)
    {
        if (di.Parent != null )
        {
            // find our parent node
            var node = treeView1.Nodes.Find(di.Parent.FullName,true);
            if (node.Length == 0)
            {
                // not found, add it as root
                // FullName becomes the key
                treeView1.Nodes.Add(di.FullName, di.Name);
            }
            else
            {
                // not sure what is going on if node.Length > 1
                // anyway, add it to the first node, to be our parent
                node[0].Nodes.Add(di.FullName, di.Name);
            }
        }
        else
        {
            treeView1.Nodes.Add(di.FullName, di.Name);
        }
    } 

一个简单的迭代器将驱动这个方法:

        var list = GetDirectories();
        foreach(var di in list)
        {
            Add(di);
        }