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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка XML документы в TreeView 
:(
    Опции темы
Srg
Дата 17.5.2007, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствйте, 

У меня такой вопрос:

Если я имею XML файл примерно такого содержания
Код
<?xml version="1.0" encoding="UTF-8"?>
<NodeList>
 <MyNode>
         <ID>1</ID>
         <ParentID>0</ParentID>
         <NodeType>0</NodeType>
         <Name>Все</Name>
         <ImageIndex>34</ImageIndex>
         <Expanded>0</Expanded>
 </MyNode>
 <MyNode>
         <ID>2</ID>
         <ParentID>0</ParentID>
         <NodeType>1</NodeType>
         <Name>Категории</Name>
         <ImageIndex>1</ImageIndex>
         <Expanded>1</Expanded>
 </MyNode>
 <MyNode>
         <ID>70000</ID>
         <ParentID>0</ParentID>
         <NodeType>0</NodeType>
         <Name>Топ</Name>
         <SaveTo>C:</SaveTo>
         <ImageIndex>46</ImageIndex>
         <Expanded>0</Expanded>
 </MyNode>

и так дале...

Как мне его обработать так, чтобы в TreeView выводилось только Name (MyNode тоже не надо выводить) и чтобы остальные значения, например ID, ImageIndex являлись как бы свойствами этого нода, чтобы потом я могу вывести остальную информацию в ListView по ID конкретного нода.

В msdn'е нашел только такой код
Код
XmlDocument doc = new XmlDocument();
            doc.Load("nodelist.xml");

            // SECTION 2. Initialize the TreeView control.
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(new TreeNode(doc.DocumentElement.Name));
            TreeNode tNode = new TreeNode();
            tNode = treeView1.Nodes[0];

            // SECTION 3. Populate the TreeView with the DOM nodes.
            AddNode(doc.DocumentElement, tNode);
            treeView1.ExpandAll();
        }

        private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
        {
            XmlNode xNode;
            TreeNode tNode;
            XmlNodeList nodeList;
            int i;

            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;
                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
                    tNode = inTreeNode.Nodes[i];
                    AddNode(xNode, tNode);
                }
            }
            else
            {
                inTreeNode.Text = (inXmlNode.OuterXml).Trim();
            }
        }                
 

Причем он выводит все подряд...вот так - см. вложение

Очень прошу помощи...

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  tree.JPG 18,62 Kb
PM MAIL   Вверх
Сарт
Дата 17.5.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот те пример для разбирательства, взято с .Net World


Для начала добавим обработчик щелчка по кнопке:

   
Код

     private void button1_Click(object sender, System.EventArgs e)
        {
            // Получаем все диски (a:, c: и т.д.).
            string [] drives = Directory.GetLogicalDrives();
            foreach(string s in drives)
            {
                // Добавляем корневой элемент для каждого диска.
                TreeNode tn = treeView1.Nodes.Add(s);
                // Добавляем фиктивный подузел для каждого
                // диска (для появления квадратика с плюсиком).
                tn.Nodes.Add("");
                // Устанавливаем свойство tag.
                // Пустое значение свойства ("") - узел еще не раскрывался.
                // Плюс ("+") - узел раскрывался и в него были
                // добавлены нужные подузлы.
                tn.Tag = "";
            }
        }


Тут мы делаем две вещи- во-первых, мы показываем все диски, которые есть на нашем компьютере (метод GetLogicalDrives) и, во-вторых, для каждого узла добавляем фиктивный подузел для появления плюсика рядом с ним.

Двигаемся дальше. Добавим код, выполняющийся перед раскрытием некоторой ветки дерева:

     
Код

   // Перед раскрытием ветки дерева вызываем NodeExpand.
        private void treeView1_BeforeExpand(object sender,
            System.Windows.Forms.TreeViewCancelEventArgs e)
        {
            // Добавление подузлов перед раскрытием.
            NodeExpand(e.Node);
        }


Вот код обещанного метода NodeExpand:

     
Код

   // Раскрытие ветки дерева.
        private void NodeExpand(TreeNode tn)
        {
            // Если есть подузлы.
            if(tn.Nodes.Count!=0)
            {
                // Если раскрываем в первый раз.
                if(((string)tn.Tag)=="")
                {
                    // Удаляем фиктивный узел.
                    tn.Nodes.RemoveAt(0);
                    // Добавляем подузлы.
                    AddTreeNodes(tn);
                    // Устнавливаем признак того, что
                    // узел уже раскрывали и добавили в него все подузлы.
                    tn.Tag = "+";
                }
            }
        }


Тут мы опять делаем только часть работы (чтобы не запутаться) - а именно вызываем пока не написанный нами метод AddTreeNodes. Наш код достаточно прост - а именно мы раскрываем наш узел только если он не пуст (проверка условия tn.Nodes.Count!=0). Если он не пуст, то мы удаляем добавляемый при создании фиктивный узел (который служил только для того, чтобы показать знак "+" для непустых папок у нашего дерева) и добавляем реальные подузлы (напомним еще раз, что для этого нам еще предстоит написать метод AddTreeNodes). Далее мы устанавливаем для нашего узла признак того, что он уже раскрывался и что нам для него не надо будет добавлять узлы (т. е. записываем в свойство Tag значение "+").

Давайте напишем еще один вспомогательный метод - GetFullPath. Этот метод по узлу нашего дерева возвращает полный путь (т. е. от корневого узла (папки), до нашего узла (папки), включая все промежуточные узлы (папки)). Вот код метода GetFullPath:

     
Код

   // Получение полного имени папки по узлу.
        private String GetFullPath(TreeNode tn)
        {
            // Устанавливаем текуший узел на переданный в параметре.
            TreeNode currNode = tn;
            // В полное имя пока записываем текст,
            // показываемый в текущем узле.
            String fullPath = currNode.Text;
            // Двигаемся к корню дерева.
            while(currNode.Parent!=null)
            {
                // Переходим на родительский узел.
                currNode = currNode.Parent;
                // К полному имени приписываем текст родитеского узла.
                fullPath= currNode.Text + @"\" + fullPath;
            }
            // Возвращаем полный путь.
            return fullPath + @"\";
        }


Принцип работы этого метода такой - берем родительский узел для нашего узла, приписываем его текст влева, потом берем родительский узел для родительского, берем узел для него и т. п., пока не окажемся в корневом узле (который соответствует диску в файловой системе).
Осталось для нашего дерева папок, начатаго на уроке 18, добавить метод AddTreeNodes для добавления подузлов. Вот его код (этот метод добавляем естественно, в класс формы):

        
Код

// Добавление подузлов.
        private void AddTreeNodes(TreeNode tn)
        {
            TreeNode aux;
            // Получаем полный путь для папки узла.
            DirectoryInfo d = new DirectoryInfo(GetFullPath(tn));
            // Массив для хранения подпапок.
            DirectoryInfo[] ds;
            try 
            {
                // Получаем все подпапки для папки.
                ds = d.GetDirectories();
                
                // Для каждой папки выводим ее имя и имена всех подпапок.
                foreach (DirectoryInfo s in ds)
                {
                    // Добавляем каждую подпапку.
                    aux = tn.Nodes.Add(s.Name);
                    // Устанавливаем для нее признак, что ее еще не раскрывали.
                    aux.Tag = "";
                    try 
                    {
                        // Если она не пуста,
                        if(s.GetDirectories().GetLength(0)!=0)
                        {
                            //  то добавляем в нее фиктивный узел.
                            aux.Nodes.Add("");
                        }
                    }
                    // Перехватываем исключение запрещенного доступа.
                    catch (UnauthorizedAccessException)
                    {
                    };

                }
            }
            //Перехват общего исключения (например, если диск a: не вставлен).
            catch(Exception)
            {
            }
        }

Тут есть несколько тонкостей. Во-первых, мы используем исключения. Это необходимо потому, что не все диски или папки могут оказаться доступными. Во-вторых, обратите внимание, что плюсики мы добавляем не к каждому узлу, а только к непустым. Т. е. рядом с пустыми папками сразу ничего показываться не будет.





Половина из тут написанного тебе не нужна, но зато поразбираешься=)

--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
KuZyagroup
Дата 23.5.2007, 04:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


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

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



Цитата

 Наш код достаточно прост - а именно мы раскрываем наш узел только если он не пуст (проверка условия tn.Nodes.Count!=0). Если он не пуст, то мы удаляем добавляемый при создании фиктивный узел (который служил только для того, чтобы показать знак "+" для непустых папок у нашего дерева) и добавляем реальные подузлы (напомним еще раз, что для этого нам еще предстоит написать метод AddTreeNodes). 

У меня вопросик:
Если мы добавляем фиктивный узел то tn.Nodes.Count=1 ???
Или я где то запутался.
П.С. А можно ссылку на источник материала. Заранее спасибо 
PM MAIL   Вверх
Naum
Дата 23.5.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Цитата(KuZyagroup @  23.5.2007,  05:28 Найти цитируемый пост)
Если мы добавляем фиктивный узел то tn.Nodes.Count=1 ???

Да. Никто ведь кроме нас, по идее, не знает, что этот узел - фиктивный.



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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