2010-12-01 5 views
4

Как вставить новый дочерний элемент в определенный узел в TreeView в C# WinForms?C# - TreeView: вставка узла в определенную позицию

Я неумело колоть в TreeViews почти час, и я хотел бы использовать C# 's TreeView так:

treeView.getChildByName("bob").AddChild(new Node("bob's dog")); 

Вот что я пытался в последний раз (я думаю, что это на уровне волосатости который C# никогда не позволял мне доходить):

tree.Nodes[item.name].Nodes.Add(new TreeNode("thing")); 

Излишне говорить, что это не работает.

О, и вот ленивый вопрос: можете ли вы на самом деле хранить объекты в этих узлах? Или TreeNode поддерживает только строки и еще много чего? (в этом случае я должен расширить TreeNode ../sigh)

Пожалуйста, помогите, спасибо!

+0

Если вы можете свободно выбирать, взгляните на WPF. Вы можете смоделировать свои данные по своему усмотрению и привязать их к TreeView. – VVS

+0

О, чувак, я бы переключился на WPF в одно мгновение, если бы у меня был вариант. Для начала все, что угодно с помощью XML, является шагом вперед. – Spectraljump

ответ

6

На самом деле ваш код должен работать - для того, чтобы добавить узел к югу вы просто должны сделать:

myNode.Nodes.Add(new TreeNode("Sub node")); 

Может быть, проблема в том, как вы обратитесь к существующим узлам. Я предполагаю, что tree.Nodes [item.Name] вернул null?

Чтобы этот указатель мог найти узел, вам нужно указать ключ при добавлении узла. Вы указали имя узла в качестве ключа? Например, следующий код работает для меня:

treeView1.Nodes.Add("key", "root"); 
treeView1.Nodes["key"].Nodes.Add(new TreeNode("Sub node")); 

Если мой ответ не работает, вы можете добавить более подробную информацию о том, что действительно происходит? Вы получили какое-то исключение или просто ничего не случилось?

PS: для хранения объекта в узле вместо использования свойства Tag вы также можете получить свой собственный класс из TreeNode и сохранить что-либо в нем. Если вы разрабатываете библиотеку, это более полезно, потому что вы оставляете свойство Tag для своих пользователей.

Ran

+0

Спасибо, сэр! 'tree.Nodes [item.Name]' действительно возвращал значение null (хотя мне потребовалось некоторое время, чтобы понять это). Я не знал, как установить индексный ключ, как вы показали. Это была моя проблема (у меня также была «несвязанная» проблема, которая еще больше смутила меня), но я не смог получить узел, в который я хотел вставить. Еще раз спасибо. – Spectraljump

2

Ну, для начала, да, вы можете хранить объекты в каждом узле. Каждый узел имеет свойство Tag типа object.

Добавление узлов должно быть довольно простым. Согласно MSDN:

// Adds new node as a child node of the currently selected node. 
TreeNode newNode = new TreeNode("Text for new node"); 
treeView1.SelectedNode.Nodes.Add(newNode); 
+0

whew!Спасибо за совет. – Spectraljump

+0

Что касается вашего редактирования, у меня не будет «SelectedNode» для добавления. Так что этот метод (из которого я читал кстати) не помогает .. – Spectraljump

+0

А ... похоже, у Ран есть несколько хороших примеров и они выглядят так, как будто они будут работать - мне не нужно перефразировать то, что у него есть. :) – IAbstract

3

Вы можете использовать Insert вместо Add.

tree.Nodes[item.name].Nodes.Insert(2, (new TreeNode("thing"))); 
0

В противном случае, если DaVita не является идеальным ответом, вам нужно сохранить ссылку на узлы, так что если у вас есть ссылка на боб, вы можете добавить собаку Боба

TreeNode боб = новый TreeNode ("Боб"); treeView1.Nodes.Add (bob); bob.Nodes.Add (новый TreeNode («Собака»));

+0

Это правда, что мне нужна какая-то ссылка. Но я не могу делать то, что вы написали, поскольку я не буду добавлять узлы в ту же самую функцию, где я вставляю. Несмотря на это, Ран решил мою проблему и просветил меня: у меня не было «ключа», и я не знал, как его установить. – Spectraljump

Смежные вопросы