получить папку для дерева - PullRequest
0 голосов
/ 20 мая 2011

Я использую следующий код, чтобы получить содержимое папки в TreeView.Но текущий код всегда добавляет содержимое в корень TreeView.Он не добавляет их в качестве дочерних узлов узла родительской папки.

Можете ли вы мне помочь?

void Recurse(string path)
{
    DirectoryInfo info = new DirectoryInfo(path);
    TreeNode root = new TreeNode(info.Name);
    string[] sub = Directory.GetDirectories(info.FullName);
    TreeNode node = new TreeNode();
    MailTree.Nodes.Add(root);
    if (sub.Length == 0) {

    }
    else
    {
        foreach(string i in sub)
        {       
            DirectoryInfo subinfo = new DirectoryInfo(i);                    
            root.Nodes.Add(subinfo.Name);                    
            Recurse(i);                  
        }
        //MailTree.Nodes.Add(root);
    }   
}

Ответы [ 3 ]

2 голосов
/ 20 мая 2011

Вы должны передавать корневой узел как часть вашего метода Rescure, что-то вроде Rescure(string path, TreeNode currentRoot).

Теперь вы можете вызвать currentRoot.Nodes.Add(root) вместо MailTree.Nodes.Add(root), что обеспечит переходыдобавляются только к текущему уровню.Вам также нужно изменить свой вызов в цикле на Rescure(i, root).

Наконец, ваш первоначальный вызов Rescure должен включать ссылку на предварительно созданный корневой узел, поэтому что-то вроде Rescure(initialDirectory, initialRootNode).

Я бы добавил, что имена ваших методов и переменных должны быть изменены, чтобы отражать их значение.Да, вы рекурсивный, но почему?Лучшее название метода может быть TraverseDirectory.Точно так же, вместо foreach(string i in sub), почему бы не foreach(string directoryName in sub)?Наличие ясного кода почти так же важно, как наличие правильного кода.

1 голос
/ 20 мая 2011

Рекурсивная часть вашей функции всегда добавляет дочерние узлы в корень.Вам необходимо добавить «родительский узел» в качестве параметра вашей рекурсивной функции.Как то так:

void Recurse(string path, TreeNode parentNode)
{
    DirectoryInfo info = new DirectoryInfo(path);
    TreeNode node = new TreeNode(info.Name);

    if (parentNode == null)
        MailTree.Nodes.Add(node);
    else
        parentNode.Nodes.Add(node);

    string[] sub = Directory.GetDirectories(path);
    if (sub.Length != 0)
    {
        foreach(string i in sub)
        {       
            Recurse(i, node);                  
        }
    }   
}
0 голосов
/ 20 мая 2011

С первого взгляда я не вижу ошибок в коде, но могу предложить другой подход: показанный вами слишком дорогой. Просто заполните уровень на дереве и поместите несколько фиктивных элементов в качестве листа в каждый добавляемый вами узел. Затем перехватите событие NodeExpanding, удалите фиктивный узел и добавьте подузлы (рекурсивно применив ту же стратегию добавления фиктивных дочерних узлов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...