Заполнение TreeView

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by return, 11 Dec 2011.

  1. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    Перерыл гугл, примеры есть но большинство из них приспособлены к бд. А у меня вот такая задачка:

    Пишу я экспертную систему продукционной модели (это не о чём не говорит и это не главное), в файле хранятся не которые данные (вопросы), вытягиваю их и заношу в список объектов:

    Класс:
    Code:
    class A
    {
        private string question;
        private bool goal;
        private A obj;
        private int yes;
        private int no;
        public A(string buf, bool n, int yes, int no)
        {
            question = buf;
            goal = n;
            this.yes = yes;
            this.no = no;
        }
        public A(string buf, bool n)
        {
            question = buf;
            goal = n;
        }
        public A(A obj)
        {
            this.obj = obj;
        }
        public bool response()
        {
            int n;
            Console.WriteLine(question);
            n = Int32.Parse(Console.ReadLine());
            if (n == 0)
                return false;
            return true;
        }
        public bool GetGoal() { return goal; }
        public string GetQuestion() { return question; }
        public int GetYes() { return yes; }
        public int GetNo() { return no; }
    }
    
    Заполняю список (это я для примера, а в реале данные будут тянутся с файла), данные которые хранятся в объектах - вопрос и номера индексов на следующие по ветке вопросы (не обязательно 2):
    Code:
                List<A> ob = new List<A>();
                ob.Add(new A("Программа для интернета?", false, 1, 2));
                ob.Add(new A("Сокеты?", false, 3, 4));
                ob.Add(new A("Отладка ядра?", false, 5, 6));
                ob.Add(new A("Сетевые протоколы?", false, 7, 8));
                ob.Add(new A("Флеш анимация?", false, 9, 10));
                ob.Add(new A("Assembler", true));
                ob.Add(new A("Мультимеди?", false, 7, 12));
                ob.Add(new A("C#/C++", true));
                ob.Add(new A("C", true));
                ob.Add(new A("JQuery/JavaScript", true));
                ob.Add(new A("Php/Html/Css", true));
                ob.Add(new A(ob[7]));
                ob.Add(new A("Linux", false, 13, 14));
                ob.Add(new A("Phyton", true));
                ob.Add(new A("Ответ не найден", true));
    
    Дерево не бинарное, мне просто нужно показать визуально структуру дерева вопросов и ответов на них. В интернете пишут что нужно рекурсией, пробовал но что то не вяжется. Во общем как мне из List теперь построить дерево, или предложите альтернативу, помогите :confused:
     
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Whaaat?
     
  3. mrazota

    mrazota New Member

    Joined:
    8 Dec 2011
    Messages:
    20
    Likes Received:
    1
    Reputations:
    0
    Если просто показать структуру то просто добавляй узлы так чтобы они эту структуру отражали. Подробнее опиши объекты которые ты хранишь в листе. Как я поняла есть вопрос и подвопрос и ответы, так? или что?
     
    #3 mrazota, 12 Dec 2011
    Last edited: 13 Dec 2011
  4. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    В объекте хранятся вопрос и две цифры (они же являются индексами объектов на ответы). Например
    Code:
    ob.Add(new A("Программа для интернета?", false, 1, 2));
    индекс этого объекта 0, а цифры передаваемые 1 и 2 это индексы следующих добавляемых объектов-ответов:
    Code:
                ob.Add(new A("Сокеты?", false, 3, 4));
                ob.Add(new A("Отладка ядра?", false, 5, 6));
    
     
  5. mrazota

    mrazota New Member

    Joined:
    8 Dec 2011
    Messages:
    20
    Likes Received:
    1
    Reputations:
    0
    и получается что то такое? так?

    [​IMG]
     
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    return, советую посмотреть в сторону LinkedList, другие решения мне кажутся как-то костыльно смотрятся.
     
  7. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    mrazota да-да вот оно самое должно появится, с этих двух ответов будет ещё по два в каждом (но может быть и больше двух, дерево не обязательно бинарное).
    W!z@rD а в чём разница что я буду использовать? (не ну я то понимаю разницу LinkedList и List). Если мне нужно всего лишь заполнить treeview со списка, а над списком не будут проводится какие либо операции.
     
  8. mrazota

    mrazota New Member

    Joined:
    8 Dec 2011
    Messages:
    20
    Likes Received:
    1
    Reputations:
    0
    ну поняла теперь) вечером напишу, мне тут работы подкинули)
     
    #8 mrazota, 12 Dec 2011
    Last edited: 13 Dec 2011
  9. mrazota

    mrazota New Member

    Joined:
    8 Dec 2011
    Messages:
    20
    Likes Received:
    1
    Reputations:
    0
    1 цикл по всем элементам листа, пока есть еще элементы
    2 проверяем этот элемент корень или ветвь
    3 если корень то добавляем и удаляем, если ветвь то проходим по собранному TreeView и добавляемся и удаляем, если не нашли корень ветви, то фиг с ним идем дальше.
    4 берем следующий элемент
    ...

    по логике должно отработать
     
  10. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    в голове понятно, а с реализацией нет.
    что значит добавляем или удаляем? это?
    Code:
    TreeNode root = new TreeNode(ob[0].GetQuestion(); //корень только один в данной проге это первый элемент списка
    treeView1.Nodes.Add(root);// добавил корень
    //................................
    for(int i=0; i<ob.Count; i++) //цикл по всем переборам списка
    {
       int yes = ob[i].GetYes(); //ветвь корня, индекс объекта
       int no = ob[i].GetNo(); //ветвь корня, индекс объекта
       TreeNode tn = new TreeNode(ob[yes].GetQuestion());
       root.Nodes.Add(tn);
       tn = new TreeNode(ob[no].GetQuestion());
       root.Nodes.Add(tn);
       treeView1.Nodes.Add(root); //добавил две ветви в корень
       //теперь в эти две ветви нужно добавить ихние ветви (то есть 3 уровень) а в те ветви ихние ветви пока не достигнем конца (цели), но как?
       //кстати вылазит ошибка на последней строке ArgumentException - невозможно добавить или вставить элемент "Root" в несколько позиций
    }
    
    вот выходит такое, дальше ошибка выскакивает и т.д., короче только до второго уровня дохожу и всё
    [​IMG]
     
  11. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    Короче пошарился в интернете подсказали что лучше в xml держать данные и от туда уже тянуть в XmlNode потом из него в TreeNode, вот что вышло:
    Code:
                XmlDocument doc = new XmlDocument();
                doc.Load("Sample.xml");
                XmlNodeList nl = doc.DocumentElement.SelectNodes("parent");
                foreach (XmlNode n in nl)
                {
                    TreeNode node = new TreeNode();
                    node.Text = n.SelectSingleNode("question").InnerText;
                    node.Tag = n.OuterXml;
                    treeView1.Nodes.Add(node);
                }
    
    Вот фрагмент xml-файла:
    вот только результат выходит не деревом:
    [​IMG]