2009-03-02 88 views
0

我有一個樹視圖,其中在選擇節點時必須在列表框中顯示屬性和值。
在treeView1_AfterSelect中,文本解析代碼依賴於樹視圖中節點的文本表示,可以隨時更改該節點並中斷整個列表顯示的邏輯。應該通過將樹視圖中的節點綁定到XML文檔的節點來消除樹視圖和列表顯示之間的強烈依賴關係,以便可以使用原始Xml數據來顯示列表中的文本。我應該在這裏寫什麼?如何通過在樹視圖中將節點綁定到XML文檔的節點來顯示treenodes

private static void AddingNodesToTree(XmlNode xmlNode,TreeNode tnode) 
     { 
      //Adding nodes to tree while looping through the entire XML file 
      if (xmlNode.HasChildNodes) 
      { 
       XmlNodeList nodeList = xmlNode.ChildNodes;     
       for (int i = 0; i <= nodeList.Count - 1; i++) 
       { 
        XmlNode xmladdtreeNode = xmlNode.ChildNodes[i]; 
        String nodetype = "" + xmladdtreeNode.NodeType; 
        if (nodetype.Equals("Text") || nodetype.Equals("Comment"))  
        { 
        tnode.Nodes.Add(new TreeNode(xmladdtreeNode.InnerText));   
        } 
        else              
        { 
         String name = "<" + xmladdtreeNode.Name; 
         XmlAttributeCollection attCol = xmladdtreeNode.Attributes; 
         foreach (XmlAttribute xmlatt in attCol) 
         { 
         name += " " + xmlatt.Name + "=\"" + xmlatt.Value + "\""; 
         } 
         name += ">"; 
         TreeNode tn = new TreeNode(xmladdtreeNode.Name); 
         tn.Text = name; 
         tnode.Nodes.Add(tn); 
         TreeNode treeNode = tnode.Nodes[i]; 
         AddingNodesToTree(xmladdtreeNode,treeNode); 
         } 
       }//for 
      }//if 
      else 
      { 
       tnode.Text = xmlNode.OuterXml.Trim(); 
      }//else 
     }//AddingNodesToTree 
     //To show Attributes and values of selected Nodes. 
     private void treeView1_AfterSelect(object sender,TreeViewEventArgs e) 
     { 
      TreeNode treenode = e.Node; //Node selected in Treeview    
      String text = treenode.Text; 
      String relevent = text; 
      Boolean flag = true; 
      while (flag) 
      { 
       int SpaceIndex = relevent.IndexOf(" "); 
       if (SpaceIndex != -1) 
       { 
        int indexofEqual = relevent.IndexOf('=', SpaceIndex); 
        if (indexofEqual != -1) 
        { 
         int indexOFValue = relevent.IndexOf("\"", indexofEqual + 2); 
         if (indexOFValue != -1) 
         { 
    String attribute = relevent.Substring(SpaceIndex + 1, indexofEqual - SpaceIndex - 1); 
    String value = relevent.Substring(indexofEqual + 2, indexOFValue - indexofEqual - 2); 
    listBox1.Items.Add("Attribute : " + attribute + " Value : " + value);     
          relevent = relevent.Substring(indexOFValue); 
         } 
         else 
         { 
         listBox1.Items.Add("Bad format of the xml file for this node"); 
         flag = false; 
         } 
        } 
        else 
        { 
         flag = false; 
        } 
       } 
       else 
       { 
        flag = false; 
       } 
      } 
     }//AfterSelect() 

感謝....

回答

0

如果我理解正確的問題,你要當選擇樹節點要回了XmlNode的。通常的解決辦法是將XmlNode的存儲在標籤屬性:

TreeNode tn = new TreeNode(); 
tn.Text = name; 
tn.Tag = xmladdtreeNode; 

,並在AfterSelect

TreeNode treenode = e.Node; 
XmlNode xmlNode = (XmlNode) treeNode.Tag; 
+0

請看你給我的語法的答案。 – 2009-03-03 13:31:27

+0

你能告訴我我錯了嗎? – 2009-03-03 13:35:39

0

我試過,但得到了NullRefrenceException在該行 的foreach(在attCol XmlAttribute xmlatt)上attcol

這是我寫的代碼..

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) 
    { 
     listBox1.Items.Clear(); 
     XmlNode xNode = e.Node.Tag as XmlNode; 
     XmlAttributeCollection attCol = xNode.Attributes; 
     foreach (XmlAttribute xmlatt in attCol) 
     { 
      listBox1.Items.Add(xmlatt.Name); 
      listBox1.Items.Add(xmlatt.Value); 

     } 
    } //AfterSelect() 
相關問題