2014-11-23 99 views
0

我在我的第一個C#Winform應用程序上工作:( 我瀏覽XML文件到一個treeView,然後我選擇節點,我想刪除它。我的問題是: 每個節點包含一個id屬性,那麼這個節點使用兩種或兩種樹的時間在同一個文件,答我想刪除所有重複當屬性相似時從treeView中刪除節點

這是一個EXP:

<list> 
<object number="3" background_colour="7" id="2996" name="MyFirst" type="2"> 

    <child id="3794" x="0" y="0"/> 
    <child id="13794" x="0" y="44"/> 
    <child **id="13794**" x="239" y="44"/> 
</object> 
<object height="4" id="13793" line="24487" direction="1"/> 

<object height="194" **id="13794"** line_attributes="24487" line ="0"/> 
</list`> 

所以,現在我可以刪除節點(節點是一個對象),但我想要如果我刪除ID = 13794的對象,我自動刪除ID = 13794

我真的從一週開始考慮這個問題:(如果有人有一個想法。謝謝。

我的功能代碼:

private void DeleteHandler(TreeNode tNode) 
    { 
     tNode.BackColor = Color.Red; 
     var messageResult = MessageBox.Show("Are u sur to delete node and childs?", "Alerte de suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (messageResult == System.Windows.Forms.DialogResult.Yes) 
      RemoveChildNodes(tNode); 
     else 
      tNode.BackColor = Color.Transparent; 
    } 


    private void RemoveChildNodes(TreeNode aNode) 
    { 

     if (aNode.Nodes.Count > 0) 
     { 
      for (int i = aNode.Nodes.Count - 1; i >= 0; i--) 
      { 
       aNode.Nodes[i].Remove(); 
      } 
     } 
     var messageResult = MessageBox.Show("Delete from XML too ?", "Alerte de suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (messageResult == System.Windows.Forms.DialogResult.Yes) 
      aNode.Remove(); 

    } 

    private void deleteNode_Click(object sender, EventArgs e) 
    { 
     TreeNode sourceNode = sourceTreeView.SelectedNode; 
     DeleteHandler(sourceNode); 
    } 
+0

你現在在做,直到和它是如何不工作?更新問題。 – 2014-11-23 13:03:21

+0

現在,一個可以選擇節點並刪除它們,但只有一個節點! 我想刪除具有相同屬性值的所有節點ID – 2014-11-23 13:08:53

+0

如果需要改進,請在此處發佈您的代碼。如果它是保密的,匿名它。 – 2014-11-23 13:11:10

回答

0

使用LINQ,你可以刪除XML節點都具有一定的ID是這樣的。

private XDocument DeleteID(string XmlFile, string NodeID) 
    { 
     XDocument list = XDocument.Load(XmlFile); 

     list.Descendants().Where(elm => (string)elm.Attribute("id") == NodeID).Remove(); 

     return list; 
    } 

然後,您可以編輯RemoveChildNodes是這樣的:

private void RemoveChildNodes(TreeNode aNode) 
    { 
     //get the id from the node (I don't know where id is for our purpose I'll say it is in tag 
     XDocument list = DeleteID(@"c:\temp\test.xml", (string)aNode.Tag); 

     //reload the tree here 

     var messageResult = MessageBox.Show("Delete from XML too ?", "Alerte de suppression", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
     if (messageResult == System.Windows.Forms.DialogResult.Yes) 
     { 
      list.Save(@"c:\temp\test.xml"); 
     } 
    } 
0

如果我明白你想要做的是消除所有從你樹具有相同ID的節點。 LINQ可用於構建具有特定ID的所有節點的集合,然後您可以刪除列表中的所有節點。

對不起,我目前沒有時間來產生任何代碼,但我希望這有助於。

好的,我添加了一些代碼。 這是我敲的一小段代碼。將它用於一個想法,我沒有測試過它。這隻會檢查頂層的節點,但這並不難解決。

IEnumerable<TreeNode> Result = TreeView.Nodes.WHERE((N) => N.ID == "13794"); 
foreach(TreeNode Node in Result){TreeView.Nodes.Remove(Node);} 

希望這有助於 丹尼

+0

是這樣的,但問題是我不知道它是如何戰鬥它......也許如果你有時間以後,你可以告訴我如何啓動 謝謝 – 2014-11-23 13:49:35

+0

這隻會工作,如果所有的節點是在同一水平沒有層次結構)。您將不得不遍歷樹來查找所有節點。 – Kevin 2014-11-23 14:50:18

+0

我在我的回答凱文中提出了這一點。 「這隻會檢查頂層的節點」。 – dannyhut 2014-11-23 15:02:22