2013-07-18 124 views
2

由于不可能使节点不可见,所以我决定不创建它们直到我需要它们。检查节点是否存在并添加子节点

我的代码:

if(comboBox3.Text == "Books") 
{ 
    if (treeView1.Nodes.ContainsKey("Books") == true) 
    { 
     treeView1.Nodes["Books"].Nodes.Add(textBox1.Text); 
    } 

    else if (treeView1.Nodes.ContainsKey("Books") == false) 
    { 
     treeView1.Nodes.Add("Books"); 
     treeView1.Nodes["Books"].Nodes.Add(textBox1.Text); 
    } 

} 

ComboBox有几类。它是负责“书籍”的代码。在TextBox中,我正在编写标题,点击一个按钮后,此代码开始工作。首先,它检查根节点“Books”是否存在。如果是,它只是添加文本框内的任何内容作为子节点。但是,如果没有,它会创建一个名为“Books”的根节点,然后添加一个子节点。即时得到错误在这行:

treeView1.Nodes["Books"].Nodes.Add(textBox1.Text); 

错误:

NullReferenceException was unhandled 

而且,是能够改变指数,即。我想做5个类别,但我想要有特定的顺序,让我们说1.House 2.Cars 3.Books 4.Phones 5.Bikes和我想先添加书籍,然后是汽车,然后是自行车。有什么可以改变索引号吗?

+0

无法隐藏节点?父节点将可折叠的权利? –

+0

我的意思是使节点不可见。 – PotatoBox

回答

3

在哪个部分你会得到错误?在if还是在else?

而且,你的代码可能会简单得多:

if(comboBox3.Text == "Books") 
{ 
    if (!treeView1.Nodes.ContainsKey("Books")) 
     treeView1.Nodes.Add("Books"); 

    treeView1.Nodes["Books"].Nodes.Add(textBox1.Text); 
} 

编辑:

在添加树节点,你必须提供为节点的名称。只有这样你才能通过名称访问集合来获得集合的节点。如果您未设置名称,则仍然可以使用索引访问该集合。但在这种情况下,您使用的是串钥匙,所以你也必须提供图书,树节点的名称:

if(comboBox3.Text == "Books") 
{ 
    if (!treeView1.Nodes.ContainsKey("Books")) 
    { 
     TreeNode booksNode = new TreeNode("Books"); 
     booksNode.Name = "Books"; 
     treeView1.Nodes.Add(booksNode); 
    } 

    treeView1.Nodes["Books"].Nodes.Add(textBox1.Text); 
} 

并再次缩短(但也许少可读),这将是:

if(comboBox3.Text == "Books") 
{ 
    if (!treeView1.Nodes.ContainsKey("Books")) 
     treeView1.Nodes.Add(new TreeNode("Books") { Name = "Books" }); 

    treeView1.Nodes["Books"].Nodes.Add(textBox1.Text); 
} 
+0

感谢您的帮助,现在代码看起来更好。我在其他部分出现错误。 – PotatoBox

+1

查看我的更新代码以获取工作解决方案。 – Abbas

+1

非常感谢,作品魅力。您的代码还解决了另一个问题,即复制“Books”根节点。 – PotatoBox

0

这不是必需的

else if (treeView1.Nodes.ContainsKey("Books") == false) 

你可以简单地else更换。

对于基于指数增加,我想你可以查看以下链接 TreeNodeCollection.Insert Method

+0

该参数不一定是TreeNode对象!如果将字符串传递给方法,则将具有指定字符串作为文本的新TreeNode添加到节点集合的末尾。 – Abbas

+0

是的,你是对的。谢谢 :) –

2

ContainsKey不搜索每个节点的孩子。它只搜索您提供的根节点。为了检查遏制深度,显然,你必须使用treeview.Nodes.Find(Key, true)。有人知道另一种解决方案吗?

相关问题