2016-10-24 66 views
0

我使用类Node创建我的TreeViewItems。在这个例子中,节点是在源代码中指定的。但我怎么做,如果节点是从一个文本文件导入的内容是这样的:C#WPF:从文本文件创建TreeView

text file content

任何想法?

我试过以下。

public MainWindowVM() 
    { 
     private ObservableCollection<Node> mRootNodes; 
     public IEnumerable<Node> RootNodes { get { return mRootNodes; } } 
     List<string[]> TreeNodes = new List<string[]>(); 

     string[] lines = null; 
     try 
     { 
      lines = System.IO.File.ReadAllLines(MainWindow.TextFilePath , System.Text.Encoding.Default); 
     } 
     catch (IOException ex) 
     { 
      MessageBox.Show(ex.Message); 
      Environment.Exit(0); 
     } 
     if (lines == null || lines.Length == 0) 
     { 
      MessageBox.Show("Text file has no content!"); 
      Environment.Exit(0); 
     } 

     foreach (var line in lines) 
     { 
      TreeNodes.Add(line.Split('|')); 
     } 

     Node newNode = null; 
     Node childNode = null; 
     Node root = new Node() { Name = TreeNodes[0][0] }; 
     if (TreeNodes[0].Length > 1) 
     { 
      newNode = new Node() { Name = TreeNodes[0][1] }; 
      root.Children.Add(newNode); 
     } 
     for (int s = 2; s < TreeNodes[0].Length; s++) 
     { 
      childNode = new Node() { Name = TreeNodes[0][s] }; 
      newNode.Children.Add(childNode); 
      newNode = childNode; 
     } 
    } 

但我只得到前两个节点。我不知道如何用循环构建整个TreeView。

TreeView

+1

我特别喜欢发帖的想法*文本文件*内容*截图*。你可以把它发布为**文本**,并且还包括问题中的Node类的代码(链接不正确) – ASh

+0

请点击“Node”上的顶部。 我已更正链接。 – sanjar14

回答

0

输入例如

Root|A 
Root|B|C 
Root|B|D 
Root|E 

与您的代码的问题是,你只能处理TreeNodes[0]元素。处理元素的集合,你需要一个循环

public MainWindowVM() 
{ 
    private ObservableCollection<Node> mRootNodes; 
    public IEnumerable<Node> RootNodes { get { return mRootNodes; } } 

    string[] lines = null; 
    try 
    { 
     lines = System.IO.File.ReadAllLines(MainWindow.TextFilePath , System.Text.Encoding.Default); 
    } 
    catch (IOException ex) 
    { 
     MessageBox.Show(ex.Message); 
     Environment.Exit(0); 
    } 
    if (lines == null || lines.Length == 0) 
    { 
     MessageBox.Show("Text file has no content!"); 
     Environment.Exit(0); 
    } 
Dictionary<string, Node> nodeCache = new Dictionary<string, Node>(); 
    // processing each line 
    foreach (var line in lines) 
    {     
     Node parentNode = null; 
     string key = null; 
     // in each line there are one or more node names, separated by | char 
     foreach (string childNodeName in line.Split('|')) 
     { 
      Node childNode; 
      // names are not unique, we need a composite key (full node path) 
      key += "|" + childNodeName; 
      // each node has unique key 
      // if key doesn't exists in cache, we need to create new child node 
      if (false == nodeCache.TryGetValue(key, out childNode)) 
      { 
       childNode = new Node { Name = childNodeName }; 
       nodeCache.Add(key, childNode); 

       if (parentNode != null) 
        // each node (exept root) has a parent 
        // we need to add a child node to parent ChildRen collection 
        parentNode.Children.Add(childNode); 
       else 
        // root nodes are stored in a separate collection 
        mRootNodes.Add(childNode); 
      } 

      // saving current node for next iteration 
      parentNode = childNode; 
     } 
    } 
} 
+0

工作正常。谢谢 – sanjar14

+0

另一件事:应该允许具有相同名称的节点。我如何用字典来做到这一点?例如: Root | A Root | B | C Root | B | D – sanjar14

+0

@ sanjar14,如果名称不唯一,那么它不能是一个键。我为节点做了一个复合键。看到我的编辑 – ASh