2016-09-25 71 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