1

这是我的代码:

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出现错误。

4

1 回答 1

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");
于 2013-07-27T17:09:56.063 回答