我的代码是:
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 was unhandled
。
答案 0 :(得分:3)
致电时:
treeView1.SelectedNode.Remove();
这会将treeView1.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");