Вот пример.
Испытание Tor предполагает, что у вас есть уровни и узлы Тексты в строках Textbox
.
В тестовой кнопке щелкните сначала, чтобы создать уровни и тексты для ввода List<Tuple<int, string>>
. Затем я добавляю корневой узел и заполняю дерево. Конечно, вы можете пропустить корневой узел и добавить немного логики к AddNodes
вызову ..
private void testButton_Click(object sender, EventArgs e)
{
treeView1.Nodes.Clear();
treeView1.Nodes.Add("ROOT");
List <string> lines = textBox1.Lines.ToList();
List<Tuple<int, string>> nodes = filleNodesList(lines);
AddNodes(treeView1, treeView1.Nodes[0], nodes);
}
AddNodes
функция является рекурсивной; он удаляет первую запись после ее обработки и останавливается, когда список пуст.
Если у вас есть уровень скачок вверх ошибка записывается в выходной панели ..
void AddNodes(TreeView tv, TreeNode cNode, List<Tuple<int, string>> nList)
{
TreeNode nNode = new TreeNode();
int nLevel = cNode.Level;
Tuple<int, string> t = nList[0];
// sibling: add to our parent!
if (t.Item1 == nLevel) { nNode = cNode.Parent.Nodes.Add(t.Item2); }
// next generation: our own child!
else if (t.Item1 == nLevel + 1) { nNode = cNode.Nodes.Add(t.Item2); }
// below us: seek down the line of parents!
else if (t.Item1 < nLevel) {
while (t.Item1 < cNode.Level) cNode = cNode.Parent;
nNode = cNode.Parent.Nodes.Add(t.Item2); }
// more than 1 above: error!
else { Console.WriteLine("Error: node levels must not jump up: " +
nLevel + " --> " + t.Item1); }
// done with this element
nList.RemoveAt(0);
// anything left to do?
if (nList.Count > 0) AddNodes(treeView1, nNode, nList);
}
Подготовка предполагает, что первая строка является допустимым числом ..:
List<Tuple<int, string>> filleNodesList(List<string> lines)
{
List<Tuple<int, string>> nodes = new List<Tuple<int, string>>();
foreach(string s in lines)
{
string[] sl = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Tuple<int, string> t =
new Tuple<int, string>(Convert.ToInt16(sl[0].Trim()), sl[1].Trim());
nodes.Add(t);
}
return nodes;
}