2015-08-02 2 views
0

Я пытаюсь заполнить древовидную структуру C#. Мои данные:Заполнение многоуровневого TreeView

level data 
1  xxxx 
2  yyyy 
3  aaaa 
2  rrrr 
1  oooo 

Я хотел бы что-то вроде:

xxxxx 
_yyyy 
__aaaa 
_rrrrr 
ooooo 

я использовал код, как это:

for (int index = 0; index < dt.Rows.Count; index++) 
{ 
    TreeNode newNode = new TreeNode(dt.Rows[index]["Item"].ToString()); 
    treeView1.Nodes.Add(newNode); 
    for (int j = index; j < dt.Rows.Count; j++) 
    { 
     TreeNode newNode1 = new TreeNode(dt.Rows[j]["Item"].ToString()); 
     newNode.Nodes.Add(newNode1); 
     // treeView1.SelectedNode.Nodes.Add(newNode1); 
    } 
}  

Но результат плохой один. Я вижу только 2 уровня.

Я знаю, что мне нужно что-то вроде рекурсивной функции, но я не знаю, как пройти через дерево и вернуться к корню.

ответ

0

Вы должны сделать что-то вроде этого:

void TraverseTree(TreeNodeCollection nodes) 
{ 
    foreach (var child in nodes) 
    { 
     DoSomethingWithNode(child); 
     TraverseTree(child.Nodes); 
    } 
} 

И назвать его:

TraverseTree(MyTreeView.Nodes); 

DoSomethingWithNode Просто замените метод с логикой

0

Вот пример.

Испытание 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; 
} 
Смежные вопросы