Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView, Помогите с отображением 
V
    Опции темы
Alkash
Дата 30.8.2010, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Доброго времени суток господа...Возник вопрос:
Допустим, есть 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? Тоесть, сначала узлы первого уровня, в них узлы второго, в узлы второго - узлы третьего. В гугле подходящей подсказки не нашёл-) Заранее благодарен.


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Экскалупатор
Дата 30.8.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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

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

PM MAIL ICQ   Вверх
Alkash
Дата 30.8.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



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

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


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Alkash
Дата 30.8.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



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


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Экскалупатор
Дата 30.8.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Код

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


добавляет дочерний узел к узлу с именем Node1
PM MAIL ICQ   Вверх
Alkash
Дата 30.8.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



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


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Экскалупатор
Дата 30.8.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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


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

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

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

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


Это сообщение отредактировал(а) Экскалупатор - 30.8.2010, 11:56
PM MAIL ICQ   Вверх
Alkash
Дата 30.8.2010, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



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


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Экскалупатор
Дата 30.8.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



самый элементарный вариант:
Код

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());
                        }
                    }
                }
            }

PM MAIL ICQ   Вверх
Alkash
Дата 30.8.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



О...Спасибо, мысль понял


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
wester
Дата 30.8.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 4
Всего: 13



Экскалупатор, 

вот например тут проблема - в 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);
            }
        }



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

Это сообщение отредактировал(а) wester - 30.8.2010, 16:10
PM MAIL   Вверх
Экскалупатор
Дата 30.8.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



treeView1.Nodes[nodeIndex-1].Nodes.Add(newNode);
а если убрать -1?

Добавлено через 5 минут и 25 секунд
e.Node.Index - тут возвращается индекс того нода который разворачивается , для чего отнимать от него -1? у тебя где то вопросы с алгоритмом, проведи рефакторинг, разбери свой метод на два, и сразу станет понятно.
PM MAIL ICQ   Вверх
userdab
Дата 3.9.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 3.9.2010

Репутация: нет
Всего: нет



Посмотрите Вставка данных в TreeView , может это вам чем-то поможет.
PM MAIL   Вверх
ZuTa
Дата 12.9.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Пишу файловый менеджер.
Как в TreeView отоброзить каталог файлов ?

PM MAIL WWW   Вверх
CYBERDREAM
Дата 12.9.2010, 14:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



рекурсивно
http://www.dreamincode.net/code/snippet2591.htm

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


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Fortnox
Дата 12.9.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



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]);


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

Это сообщение отредактировал(а) Fortnox - 12.9.2010, 14:30
PM MAIL   Вверх
ZuTa
Дата 13.9.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



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


PM MAIL WWW   Вверх
ZuTa
Дата 21.9.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



пишу, например

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

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

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

почему лишние слэши ?
PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.9.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



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


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
ZuTa
Дата 21.9.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



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

PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.9.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



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


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
ZuTa
Дата 21.9.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



ну да, а у меня в дебаге получается 4 слэша
с чем же это связано?!  smile 
PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.9.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



чему у тебя равен PathSeparator у treeView?


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
ZuTa
Дата 21.9.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



одному слэшу \

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

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

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



PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.9.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 11
Всего: 28



тогда оставь название диска и двоеточие у корневых узлов


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1056 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.