【问题标题】:Treeview with different folder classes具有不同文件夹类的树视图
【发布时间】:2016-09-15 05:20:52
【问题描述】:

我正在尝试将树视图与混合类文件夹组合在一起。根文件夹是一类,子文件夹是另一类,如下所示:

Root Folder #1  <-- DirectoryItem class
--Sub Folder    <-- SubDirectoryItem class
----file        <-- FileItem class
Root Folder #2  <-- DirectoryItem class
--Sub Folder    <-- SubDirectoryItem class
----file        <-- FileItem class

我一直在尝试组合两种不同的递归方法,以便将子文件夹检索为“SubDirectoryItems”而不是“DirectoryItem”由于缺乏澄清,我将放弃该代码尝试,但我想知道是否有更好的方法?

    class ItemProvider
{
    public List<Item> GetItems(string path, SearchOption searchOption)
    {
        var items = new List<Item>();
        var dirInfo = new DirectoryInfo(path);

        foreach (var directory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly))
        {
            var item = new DirectoryItem
            {
                Name = directory.Name,
                Path = directory.FullName,
                Items = GetItems(directory.FullName, SearchOption.AllDirectories)
            };

            items.Add(item);
        }

        foreach (var subdirectory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly))
        {
            var item = new SubDirectoryItem()
            {
                Name = subdirectory.Name,
                Path = subdirectory.FullName,
                Items = GetItems(subdirectory.FullName, SearchOption.AllDirectories)
            };

            items.Add(item);
        }

        foreach (var file in dirInfo.GetFiles())
        {
            var item = new FileItem
            {
                Name = file.Name,
                Path = file.FullName
            };

            items.Add(item);
        }       

        return items;
    }

}

}

【问题讨论】:

  • 我在这里很困惑。您到底在寻找什么?您是否假设在任何给定时间点都只会有一个子文件夹(级别就像子文件夹内没有其他文件夹)?本质上;子文件夹也是一个目录项。
  • 不,我想让(路径)中的所有顶级文件夹成为一种目录类类型。无论树级别有多深,其下的任何内容都应该是文件或子文件夹类类型。在我的树形视图中,顶级目录将有按钮和各种东西,我认为这将是一种更简洁的方式,而不是必须在 xaml 中使用数据触发器和 ivalueconverters 等来区分它。

标签: c# wpf treeview getdirectories


【解决方案1】:

我能够弄清楚。我创建了第一个列表 TopDirectoryOnly,然后通过 AllDirectories 的第二个列表提取了其余项目。这是代码,以防它帮助任何其他初学者(比如我):

class ItemProvider
{
    public List<Item> GetItems(string path, SearchOption searchOption)
    {
        var items = new List<Item>();
        var dirInfo = new DirectoryInfo(path);

        foreach (var directory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly))
        {
            var item = new DirectoryItem
            {
                Name = directory.Name,
                Path = directory.FullName,
                Items = GetSubItems(directory.FullName, SearchOption.AllDirectories)
            };

            items.Add(item);
        }

        return items;
    }

    public List<Item> GetSubItems(string path, SearchOption searchOption)
    {
        var items = new List<Item>();
        var dirInfo = new DirectoryInfo(path);


        foreach (var subdirectory in dirInfo.GetDirectories("*.*", SearchOption.AllDirectories))
        {
            var item = new SubDirectoryItem()
            {
                Name = subdirectory.Name,
                Path = subdirectory.FullName,
                Items = GetSubItems(subdirectory.FullName, SearchOption.AllDirectories)
            };

            items.Add(item);
        }

        foreach (var file in dirInfo.GetFiles())
        {
            var item = new FileItem
            {
                Name = file.Name,
                Path = file.FullName
            };

            items.Add(item);
        }

        return items;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多