Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > TreeView


Автор: Alkash 30.8.2010, 09:46
Доброго времени суток господа...Возник вопрос:
Допустим, есть 4 списка узлов.

Код

   //узлы первого уровня
        private List<string> FirstNode = new List<string>();
        //узлы второго уровня
        private List<string> SecondNode = new List<string>();
        //узлы третьего уровня
        private List<string> ThirdNode = new List<string>();
        //узлы четвёртого уровня
        private List<string> FourthNode = new List<string>();


Они заполняются строками следующим образом

Код

private void FillNodes()
        {
            FirstNode.Add("FirstNode1");
            FirstNode.Add("FirstNode1-1");
            FirstNode.Add("FirstNode1-2");
            FirstNode.Add("FirstNode1-3");
            FirstNode.Add("FirstNode1-4");
            FirstNode.Add("FirstNode1-5");
            SecondNode.Add("SecondNode1");
            SecondNode.Add("SecondNode1-1");
            SecondNode.Add("SecondNode1-2");
            SecondNode.Add("SecondNode1-3");
            SecondNode.Add("SecondNode1-4");
            SecondNode.Add("SecondNode1-5");
            ThirdNode.Add("ThirdNode1");
            ThirdNode.Add("ThirdNode1-1");
            ThirdNode.Add("ThirdNode1-2");
            ThirdNode.Add("ThirdNode1-3");
            ThirdNode.Add("ThirdNode1-4");
            ThirdNode.Add("ThirdNode1-5");
            FourthNode.Add("FourthNode1");
            FourthNode.Add("FourthNode1-1");
            FourthNode.Add("FourthNode1-2");
            FourthNode.Add("FourthNode1-3");
            FourthNode.Add("FourthNode1-4");
            FourthNode.Add("FourthNode1-5");
        }



Каким образом их записхнуть в TreeView? Тоесть, сначала узлы первого уровня, в них узлы второго, в узлы второго - узлы третьего. В гугле подходящей подсказки не нашёл-) Заранее благодарен.

Автор: Экскалупатор 30.8.2010, 10:10
у каждого нода есть свойство Nodes, оно возвращает коллекцию дочерних узлов вот в него и запихивай все. (у самого контрола тоже есть такое свойство). 
выглядит все это примерно так:
Код

treeView1.Nodes.Add("новый нод");
            treeView1.Nodes[0].Nodes.Add("новый дочерний нод");

Автор: Alkash 30.8.2010, 10:21
Дык пробовал. Фишка в том - как найти индекс узла в который добавлять допустим итемы из 3 списка? 

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

Автор: Alkash 30.8.2010, 10:49
А.Да. Пробовал и подпихнуть индекс выделенного узла - ну не прикрепляет он к нему почему-то-(

Автор: Экскалупатор 30.8.2010, 11:04
Код

treeView1.Nodes["Node1"].Nodes.Add("sdfsefsefwfwe");


добавляет дочерний узел к узлу с именем Node1

Автор: Alkash 30.8.2010, 11:24
А если я незнаю, какое имя может быть у нода в данный момент?

Автор: Экскалупатор 30.8.2010, 11:44
Цитата(Alkash @  30.8.2010,  10:24 Найти цитируемый пост)
А если я незнаю, какое имя может быть у нода в данный момент? 


мы ходим по кругу, расскажи что тебе конкретно нужно.

как ты определяешь какому ноду добавить дочерний узел? если всем то получай коллекцию нодов и обходи их в цикле, если какому то конкретному, то определись что должно произойти перед добавлением(к примеру, пользователь должен выбрать какой то нод, и тогда к нему добавляется дочерний узел), и по этому событию и определяй что у тебя выделено и куда тебе что то надо добавить

добавляет выделенному ноду дочерний:
Код

his.treeView1.Nodes[this.treeView1.SelectedNode.Index].Nodes.Add("wekfjbhwkejfhkwjef");

Автор: Alkash 30.8.2010, 12:05
Мне нужно, 4 коллекции запихнуть в тривью. При этом каждый узел 1 уровня - включает в себя все узлы вторго уровня, и я честно говоря - не понимаю как таки это сделать в моём случае

Автор: Экскалупатор 30.8.2010, 12:38
самый элементарный вариант:
Код

FirstNode.Add("FirstNode1");
            FirstNode.Add("FirstNode1-1");
            FirstNode.Add("FirstNode1-2");
            FirstNode.Add("FirstNode1-3");
            FirstNode.Add("FirstNode1-4");
            FirstNode.Add("FirstNode1-5");
            SecondNode.Add("SecondNode1");
            SecondNode.Add("SecondNode1-1");
            SecondNode.Add("SecondNode1-2");
            SecondNode.Add("SecondNode1-3");
            SecondNode.Add("SecondNode1-4");
            SecondNode.Add("SecondNode1-5");
            ThirdNode.Add("ThirdNode1");
            ThirdNode.Add("ThirdNode1-1");
            ThirdNode.Add("ThirdNode1-2");
            ThirdNode.Add("ThirdNode1-3");
            ThirdNode.Add("ThirdNode1-4");
            ThirdNode.Add("ThirdNode1-5");
            FourthNode.Add("FourthNode1");
            FourthNode.Add("FourthNode1-1");
            FourthNode.Add("FourthNode1-2");
            FourthNode.Add("FourthNode1-3");
            FourthNode.Add("FourthNode1-4");
            FourthNode.Add("FourthNode1-5");

            for (int i = 0; i < FirstNode.Count; ++i)
            {
                this.treeView1.Nodes.Add(FirstNode[i].ToString());
                for (int j = 0; j < SecondNode.Count; ++j)
                {
                    this.treeView1.Nodes[i].Nodes.Add(SecondNode[j].ToString());
                    for (int k = 0; k < ThirdNode.Count; ++k)
                    {
                        this.treeView1.Nodes[i].Nodes[j].Nodes.Add(ThirdNode[k].ToString());
                        for (int q = 0; q < FourthNode.Count; ++q)
                        {
                            this.treeView1.Nodes[i].Nodes[j].Nodes[k].Nodes.Add(FourthNode[q].ToString());
                        }
                    }
                }
            }

Автор: Alkash 30.8.2010, 14:08
О...Спасибо, мысль понял

Автор: wester 30.8.2010, 16:09
Экскалупатор, 

вот например тут проблема - в else на строке 63 новые ноды добавляются в root, хотя по идее должны добавляться как child, того узла который я раскрываю

Код

/// <summary>
        ///  Первичная загрузка формы
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {

            var rootNode = new TreeNode("root");
            treeView1.Nodes.Add(rootNode);
           // LoadFirsNodes();
            FillNodes(null,-3);
            
        }

        /// <summary>
        /// Заполняем TreeNode
        /// </summary>
        /// <remarks>обратить внимание при первичной обработке node</remarks>
        /// <param name="param">составная часть url</param>
        /// <param name="nodeIndex">индекс нода, который необходимо заполнить</param>
        private void FillNodes(string param,int nodeIndex)
        {
            #region создаем List<T> который необходимо вставить в Node, как child
            _inetParser = new InetParser();
            var url = _inetParser.IndexMarket;
            if(param!=null)
            {
                url += param;
                _inetParser.GetResponseWithoutProxy(url);
            }
            else
            {
                _inetParser.GetResponseWithoutProxy(_inetParser.PageWithCatMain);
            }
            
            
            _regexParser = new RegexParser(_inetParser.HtmlSource,_inetParser.IsVendorList);
            _regexParser.DetectResponse();

            #endregion

            if (_regexParser.Categ)
            {
                foreach (var item in _regexParser.ListCat)
                {
                    var newNode = new TreeNode(item.Name)
                                      {
                                          Tag = item.Url
                                      };

                    if (nodeIndex == -3) // обрабатываем событие onload формы
                    {
                        treeView1.Nodes.Add(newNode);
                    }
                    else
                    {
                        treeView1.Nodes[nodeIndex].Nodes.Add(newNode);
                    }
                    newNode.Nodes.Add("*");
                }
            }
            else // проблема - добавляется ноды в root
            {
                foreach (var item in _regexParser.ListVendor)
                {

                    var newNode = new TreeNode(item.Name)
                                      {
                                          Tag = item.Url
                                      };

                    treeView1.Nodes[nodeIndex-1].Nodes.Add(newNode);
                    newNode.Nodes.Add("*");
                }
            }
        }

        /// <summary>
        /// Обрабатываем событие - перед открытием нода
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TreeView1BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes[0].Text == @"*")
            {
                e.Node.Nodes.Clear();
                FillNodes(e.Node.Tag.ToString(), e.Node.Index);
            }
        }



как такое поправить?

Автор: Экскалупатор 30.8.2010, 17:18
treeView1.Nodes[nodeIndex-1].Nodes.Add(newNode);
а если убрать -1?

Добавлено через 5 минут и 25 секунд
e.Node.Index - тут возвращается индекс того нода который разворачивается , для чего отнимать от него -1? у тебя где то вопросы с алгоритмом, проведи рефакторинг, разбери свой метод на два, и сразу станет понятно.

Автор: userdab 3.9.2010, 17:36
Посмотрите http://social.msdn.microsoft.com/Forums/ru-RU/csharpru/thread/cff9c618-51df-4642-834a-21ba60d9bae1/ , может это вам чем-то поможет.

Автор: ZuTa 12.9.2010, 13:46
Пишу файловый менеджер.
Как в TreeView отоброзить каталог файлов ?

Автор: CYBERDREAM 12.9.2010, 14:25
рекурсивно
http://www.dreamincode.net/code/snippet2591.htm

Самое оптимальное - 
вывести список дисков, при раскрытии узла, строить его узлы, ну и т.д.
http://www.codeproject.com/KB/cs/TreeViewFileExplorer.aspx а вот пример

Автор: Fortnox 12.9.2010, 14:29
ZuTa, так:
Код

private void PopulateTreeView(DirectoryInfo dir, TreeNode node)
        {
            DirectoryInfo[] subDirs = dir.GetDirectories("*", SearchOption.TopDirectoryOnly);
            for (int i = 0; i <= subDirs.Length - 1; i++)
            {
                TreeNode t = new TreeNode(subDirs[i].Name);
                PopulateTreeView(subDirs[i], t);
                node.Nodes.Add(t);
            }
            foreach (FileInfo file in dir.GetFiles())
            {
                node.Nodes.Add(file.Name);
            }
        }

Использование:
Код

PopulateTreeView(new DirectoryInfo(/*Путь*/), treeView.Nodes[0]);


Черт, надо научиться обновлять страницу, перед отправкой.

Автор: ZuTa 13.9.2010, 19:17
Спасибо вам.
 
Но мне нужен не только код, но и описание, комментарий.
Ибо я новичок, хочу научиться чего-то, а не просто копипастом заниматься.


Автор: ZuTa 21.9.2010, 10:39
пишу, например

TreeNode tn = treeView1.SelectedNode;
string path = tn.FullPath;

допустим (папка находиться в D:\abc)

но переменная path(при выводи её в лейбл) равняется D:\\abc 

почему лишние слэши ?

Автор: CYBERDREAM 21.9.2010, 10:46
FullPath возвращает конкатенированную строку из всех родительских узлов, плюс PathSeparator ( в твоем случае это слэш)
если хочешь получить значение в узле, то tn.Node[0].Text

Автор: ZuTa 21.9.2010, 11:09
Нет, мне нужно получить в переменную path путь к папке (TreeView - это файловая система)

Автор: CYBERDREAM 21.9.2010, 11:13
проверил, нет такого) слэши в дебаге разве что видны, потому чо слэш в строке представлян двумя слэшами

Автор: ZuTa 21.9.2010, 11:20
ну да, а у меня в дебаге получается 4 слэша
с чем же это связано?!  smile 

Автор: CYBERDREAM 21.9.2010, 11:22
чему у тебя равен PathSeparator у treeView?

Автор: ZuTa 21.9.2010, 11:27
одному слэшу \

диски в тривью добавляются в таком виде C:\, D:\

потом когда вставить в какой-то подузел тринод(например в диск С папку abc)
Получаеться FullPath="C:\" + PathSeparator + "abc"

и получается два слэша,хм...



Автор: CYBERDREAM 21.9.2010, 11:30
тогда оставь название диска и двоеточие у корневых узлов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)