C# 删除树视图中的子节点
这是我的密码:C# 删除树视图中的子节点,c#,visual-studio-2010,treeview,C#,Visual Studio 2010,Treeview,这是我的密码: private void removeToolStripMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode != null) { if (treeView1.SelectedNode.Parent == null) treeView1.SelectedNode.Remove(); else if (treeView1.SelectedNo
private void removeToolStripMenuItem_Click(object sender, EventArgs e)
{
if (treeView1.SelectedNode != null)
{
if (treeView1.SelectedNode.Parent == null) treeView1.SelectedNode.Remove();
else if (treeView1.SelectedNode.Parent.Nodes.Count == 1) treeView1.SelectedNode.Parent.Remove();
else treeView1.SelectedNode.Remove();
}
XDocument doc = XDocument.Load("test.xml");
if (treeView1.SelectedNode.Parent != null)
{
var xElement = (from q in doc.Elements("dogs").Elements("dog")
where q.Attribute("id").Value == treeView1.SelectedNode.Tag.ToString()
select q);
foreach (var a in xElement)
a.Remove();
doc.Save("test.xml");
}
我想在我的文件中搜索id
值,如果程序会找到它,它会将它和所选节点的标记进行比较,如果找到它,它会删除这个节点。每次我试图删除任何节点时,都会出现未处理的错误NullReferenceException
。当您调用:
treeView1.SelectedNode.Remove();
这会将TreeView.SelectedNode设置为null,或将SelectedNode设置为已删除节点的父节点或下一个可用节点
此外,此代码还将删除的节点的父节点设置为null。这两种情况可能是导致异常的根本原因。我建议只需设置一个临时变量,指向要删除的节点:
TreeNode node = treeView1.SelectedNode;
treeView1.SelectedNode.Remove();
然后只需将代码更改为:
TreeNode node = treeView1.SelectedNode;
if (treeView1.SelectedNode != null)
{
if (treeView1.SelectedNode.Parent == null)
treeView1.SelectedNode.Remove();
else if (treeView1.SelectedNode.Parent.Nodes.Count == 1)
treeView1.SelectedNode.Parent.Remove();
else
treeView1.SelectedNode.Remove();
}
XDocument doc = XDocument.Load("test.xml");
var xElement = (from q in doc.Elements("dogs").Elements("dog")
where q.Attribute("id").Value == node.Tag.ToString()
select q);
foreach (var a in xElement)
a.Remove();
doc.Save("test.xml");
想象一下
treeView1.SelectedNode==null
在这种情况下,您将测试如果(treeView1.SelectedNode.Parent!=null)
。测试**null**values.Parent?
:)时会发生什么情况?您是否可以对此进行调试,并提供有关哪个变量为null的详细信息?为什么不必要地设置node=treeView1.SelectedNode代码>两次?OP使用了if(treeView1.SelectedNode.Parent!=null)
您用if(node!=null)
替换了if(node!=null&&node.Parent!=null)
Ahh。当我写这篇文章时,我错过了我的应用程序。我会编辑它。谢谢你的通知,当然可以。我更改这部分代码的原因是OP希望从其XML文件中删除相应的信息,但是,一旦对SelectedNode调用remove(),节点的父属性将等于null。因此,if语句永远不会等于true。OP可能希望检查当前所选节点的父节点(可能为空或不相关的节点),但我认为这不是代码的意图。您是对的,当我删除节点时,将不会有SelectedNode
。在修改此代码之前,我有理由维护两个if
s,但现在它只是多余的,所以我在Begging移动了第二个if
,其中SelectedNode
仍然有值。非常感谢,欢迎光临。我很高兴能帮上忙。我将编辑代码以反映您的设计决策。