2012-11-06 76 views
0

假設我已經在數據庫中保存了文件路徑。現在我想通過treeview顯示這些文件路徑。我發現一個樣本工作正常,但不知道數據庫中會有大量數據,那麼樹視圖總體將會掛起或花費太長時間。我在這裏給代碼。請檢查並告訴哪些可以糾正,結果在數據庫中會有大量數據時性能會很好。如何使用保存在數據庫中的文件路徑填充treeview

public static class MyDataBase 
{ 
    private static List<string> fields = new List<string>(); 

    public static void AddField(string field) 
    { 
     fields.Add(field); 
    } 

    public static IList<string> FieldsInMyColumn() 
    { 
     return fields; 
    } 
} 

public void CreateTreeView() 
    { 
     foreach (string field in MyDataBase.FieldsInMyColumn()) 
     { 
      string[] elements = field.Split('\\'); 
      TreeNode parentNode = null; 

      for (int i = 0; i < elements.Length - 1; ++i) 
      { 
       if (parentNode == null) 
       { 
        bool exits = false; 
        foreach (TreeNode node in myTreeview.Nodes) 
        { 
         if (node.Text == elements[i]) 
         { 
          exits = true; 
          parentNode = node; 
         } 
        } 

        if (!exits) 
        { 
         TreeNode childNode = new TreeNode(elements[i]); 
         myTreeview.Nodes.Add(childNode); 
         parentNode = childNode; 
        } 
       } 
       else 
       { 
        bool exits = false; 
        foreach (TreeNode node in parentNode.Nodes) 
        { 
         if (node.Text == elements[i]) 
         { 
          exits = true; 
          parentNode = node; 
         } 
        } 

        if (!exits) 
        { 
         TreeNode childNode = new TreeNode(elements[i]); 
         parentNode.Nodes.Add(childNode); 
         parentNode = childNode; 
        } 
       } 
      } 

      if (parentNode != null) 
      { 
       parentNode.Nodes.Add(elements[elements.Length - 1]); 
      } 
     } 
    } 

private void button1_Click(object sender, EventArgs e) 
    { 
     MyDataBase.AddField(@"c:\jsmith\project1\hello.cs"); 
     MyDataBase.AddField(@"c:\jsmith\project1\what.cs"); 
     MyDataBase.AddField(@"c:\jsmith\project2\hello.cs"); 
     MyDataBase.AddField(@"c:\jsmith\project1\tdp.cs"); 
     MyDataBase.AddField(@"c:\jsmith\project2\ship.cs"); 
     MyDataBase.AddField(@"d:\jsmith\project1\hello404.cs"); 
     MyDataBase.AddField(@"c:\jsmith1\project2\ship.cs"); 
     CreateTreeView(); 
    } 

感謝

+0

即可加載子節點,供我自己參考。 http://stackoverflow.com/questions/6415037/populate-treeview-from-list-of-file-paths-in-wpf http://stackoverflow.com/questions/673931/file-system-treeview http: //stackoverflow.com/questions/2436201/how-to-make-a-treeview-from-a-database-column-filepath – Thomas

回答

1

根據您的框架版本,也許你可以嘗試這樣的事:

public void ProcessPath(IEnumerable<String> path, TreeNodeCollection nodes) 
{ 
    if (!path.Any()) 
     return; 
    var node = nodes.Cast<TreeNode>().FirstOrDefault(n => n.Text == path.First()); 
    if (node == null) 
    { 
     node = new TreeNode(text: path.First()); 
     nodes.Add(node); 
    } 
    ProcessPath(path.Skip(1),node.ChildNodes); 
} 

public void CreateTreeView() 
{ 
    foreach (string field in MyDataBase.FieldsInMyColumn()) 
     ProcessPath(field.Split('\\'),myTreeView.Nodes); 
} 

如果你真的有一個巨大的行的數量,你應該尋找一個解決方案您只需點擊節點

1

首先,我可以建議改善是時間,而不是的foreach使用方法:在這兩個地方

,而不是這樣的:

bool exits = false; 
foreach (TreeNode node in myTreeview.Nodes) 
{ 
     if (node.Text == elements[i]) 
     { 
       exits = true; 
       parentNode = node; 
     } 
} 

可以使用

bool exits = false; 
int j = 0; 
while (!exits && j<myTreeview.Nodes.Count) 
{ 
     if (myTreeview.Nodes[j].Text == elements[i]) 
     { 
       exits = true; 
       parentNode = node; 
     } 
     j++; 
} 

這樣你就不需要遍歷整個Nodes集合,並且循環會在找到父節點之後立即完成。當然,在沒有標題爲元素[i]的節點的情況下,您將通過整個集合。

P.S.我覺得你的意思exists而不是exits

相關問題