Организовать TreeView, получая пути к файлам? - PullRequest
2 голосов
/ 06 июля 2011

У меня есть этот код:

    public void AddNode(string Node)
    {
        try
        {
            treeView.Nodes.Add(Node);
            treeView.Refresh();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

Очень просто, как вы видите, этот метод получает путь к файлу. как C:\Windows\notepad.exe

Теперь я хочу, чтобы TreeView показывал его как FileSystem ..

-C:\
    +Windows

И если я нажму '+', получится так:

-C:\
    -Windows
       notepad.exe

Вот что я получаю, отправляя эти тезисы вышеописанному методу:

TreeView current look

Как я могу сделать так, чтобы это устроило узлы?

Ответы [ 4 ]

1 голос
/ 06 июля 2011

На вашем месте я бы разбил входную строку на подстроки, используя метод string.Split , а затем выполнил поиск нужного узла, чтобы вставить соответствующую часть узла.Я имею в виду, что перед добавлением узла вы должны проверить, существует ли узел C: \ и его дочерний узел (Windows).

Вот мой код:

...
            AddString(@"C:\Windows\Notepad.exe");
            AddString(@"C:\Windows\TestFolder\test.exe");
            AddString(@"C:\Program Files");
            AddString(@"C:\Program Files\Microsoft");
            AddString(@"C:\test.exe");
...

        private void AddString(string name) {
            string[] names = name.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
            TreeNode node = null;
            for(int i = 0; i < names.Length; i++) {
                TreeNodeCollection nodes = node == null? treeView1.Nodes: node.Nodes;
                node = FindNode(nodes, names[i]);
                if(node == null)
                    node = nodes.Add(names[i]);
            }
        }

        private TreeNode FindNode(TreeNodeCollection nodes, string p) {
            for(int i = 0; i < nodes.Count; i++)
                if(nodes[i].Text.ToLower(CultureInfo.CurrentCulture) == p.ToLower(CultureInfo.CurrentCulture))
                    return nodes[i];
            return null;
        }
0 голосов
/ 06 июля 2011

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

0 голосов
/ 06 июля 2011

Является ли проблема в том, что родители и дети не различаются?

Каждый из узлов дерева также имеет свойство Nodes, которое представляет коллекцию его дочерних элементов.Ваша подпрограмма AddNode должна быть изменена, чтобы вы могли указать родительский узел, к которому вы хотите добавить дочерний узел.Например:

TreeNode parent = //some node
parent.Nodes.Add(newChildNode);

Если вы хотите, чтобы он просто заполнял пути и сам определял отношения родитель-потомок, вам придется написать некоторый код для разбора путей и идентификации родительского узлана основе сегментов пути.

0 голосов
/ 06 июля 2011

Если вы находитесь в окнах (и я так полагаю), вы можете реализовать класс IComparer и использовать свойство TreeView.TreeViewNodeSorter :

public class NodeSorter : IComparer
{
    // Compare the length of the strings, or the strings
    // themselves, if they are the same length.
    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        // Compare the length of the strings, returning the difference.
        if (tx.Text.Length != ty.Text.Length)
            return tx.Text.Length - ty.Text.Length;

        // If they are the same length, call Compare.
        return string.Compare(tx.Text, ty.Text);
    }
}
...