当Attribute类似时,从treeView中删除节点

时间:2014-11-23 12:35:44

标签: c# xml

正在处理我的第一个C#Winform应用程序:( 我浏览一个XML文件到treeView,然后我选择节点,我想要删除它。我的问题是: 每个节点都包含一个Id属性,然后该节点在同一个文件中使用两个或树时间,我想删除所有重复。

这是一个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);
    }

2 个答案:

答案 0 :(得分: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");
        }
    }

答案 1 :(得分:0)

如果我了解您要执行的操作,请从树中删除具有相同ID的所有节点。 LINQ可用于构建具有特定ID的所有节点的集合,然后您可以删除列表中的所有节点。

抱歉,目前我还没有时间制作任何代码,但我希望这会有所帮助。

好的,我添加了一些代码。 这是我敲了一段代码的快速代码。用它来做一个想法,我还没有测试过。这只会检查节点的最高级别,但要解决这个问题并不困难。

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

希望这会有所帮助 丹尼