2016-09-25 44 views
0

我目前正在使用文件浏览控件(https://github.com/gregyjames/FileBrowser),但我遇到了代码的性能问题。目前,您可以看到here,我有两个递归循环将根目录中的所有文件加载到树视图中。我怎样才能修改它,以便最初加载根目录中的子文件夹,然后在用户选择时加载每个目录的子目录(即用户选择一个文件夹,然后加载内容)。任何帮助表示感谢,谢谢!懒惰加载目录树视图中的子文件/文件夹

回答

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()); 
     } 
    } 
} 
+0

这个伟大的工程谢谢你最简单的/最低金额!有没有什么办法可以让文件夹上的+/-表示存在子内容或将文件和文件夹分组在一起?目前它将文件和文件夹结合在一起。我怎样才能显示文件夹比文件?类似于窗口按类型排序。 – gregyjames

+0

编辑与要求的功能,...你不需要接受答案? :) – Dan

+0

哎呀,我的坏!再次感谢! – gregyjames