Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除树视图中的子节点_C#_Visual Studio 2010_Treeview - Fatal编程技术网

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
仍然有值。非常感谢,欢迎光临。我很高兴能帮上忙。我将编辑代码以反映您的设计决策。