2014-11-23 67 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