正在处理我的第一个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);
}
答案 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);}
希望这会有所帮助 丹尼