2016-09-25 17 views
0

現在、ファイルブラウジングコントロール(https://github.com/gregyjames/FileBrowser)で作業していますが、コードのパフォーマンスに問題があります。現在、hereが表示されていますが、ルートディレクトリのすべてのファイルをツリービューに読み込む2つの再帰的ループがあります。これを変更して、ルートディレクトリのサブフォルダを最初にロードし、ユーザの選択時に各ディレクトリのサブディレクトリをロードするにはどうすればよいですか(つまり、ユーザがフォルダを選択した後、どんな助けでも感謝しています!ディレクトリツリービューのレイジーサブファイル/フォルダを読み込む

答えて

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

関連する問題