【问题标题】:Lazy Load sub files/folder in Directory Tree View在目录树视图中延迟加载子文件/文件夹
【发布时间】:2016-09-26 13:43:59
【问题描述】:

我目前正在处理文件浏览控件 (https://github.com/gregyjames/FileBrowser),但我遇到了代码性能问题。目前,如您所见here,我有两个递归循环将根目录中的所有文件加载到树视图中。我如何修改它以首先加载根目录中的子文件夹,然后在用户选择时加载每个目录的子目录(即,如果用户选择一个文件夹,那么我加载内容)。任何帮助表示感谢!

【问题讨论】:

    标签: c# .net file treeview


    【解决方案1】:

    这是我能想到的用于延迟加载子节点的最简单/最少的代码

    // Form1.OnLoad 
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
    
        var root = new FolderFileNode(_path);
        treeView1.Nodes.Add(root);
        root.LoadNodes();
    
        treeView1.BeforeSelect += (sender, args) =>
        {              
            //This flickers a lot , a bit less between BeginUpdate/EndUpdate
            (args.Node as FolderFileNode)?.LoadNodes();                
        };
    
        treeView1.AfterExpand += (sender, args) =>
        {                
            (args.Node as FolderFileNode)?.SetIcon();                
        };
    
        treeView1.AfterCollapse += (sender, args) =>
        {
            (args.Node as FolderFileNode)?.SetIcon();                
        };
    }                    
    
    class FolderFileNode : TreeNode
    {
        private readonly string _path;
    
        private readonly bool _isFile;
    
        public FolderFileNode(string path)
        {            
            if(string.IsNullOrWhiteSpace(path)) throw new ArgumentException(nameof(path));
            Text = Path.GetFileName(path);
            _isFile = File.Exists(path);
            _path = path;
    
            if (!_isFile && Directory.EnumerateFileSystemEntries(_path).Any())
            {
                //Will indicate there is children 
                Nodes.Add(new TreeNode());
            }
            SetIcon();
        }
    
        public void SetIcon()
        {
            // image[2] is Folder Open image
            ImageIndex = _isFile ? ImageIndex = 1 :  IsExpanded ? 2 : 0;
            SelectedImageIndex = _isFile ? ImageIndex = 1 :  IsExpanded ? 2 : 0;
        }
    
        private IEnumerable<string> _children;
        public void LoadNodes()
        {
            if (!_isFile && _children == null)
            {
               // _children = Directory.EnumerateFileSystemEntries(_path);
               // Or Add Directories first
               _children = Directory.EnumerateDirectories(_path).ToList();
                ((List<string>) _children).AddRange(Directory.EnumerateFiles(_path)); 
    
                //Theres one added in the constructor to indicate it has children 
                Nodes.Clear();
    
                Nodes.AddRange(
                    _children.Select(x => 
                        // co-variant
                        (TreeNode) new FolderFileNode(x))
                        .ToArray());
            }
        }
    }
    

    【讨论】:

    • 这很好用,谢谢!有什么办法我仍然可以让文件夹上的 +/- 表示有子内容或将文件和文件夹组合在一起?目前它将文件和文件夹组合在一起。我怎样才能先显示文件夹而不是文件?类似于window的按类型排序。
    • 已根据请求的功能进行编辑,...您不需要接受答案吗? :)
    • 糟糕,我的错!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多