Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
1

Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML

27.10.2018, 00:07. Показов 6097. Ответов 30

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток.

Тема является продолжением вот этой темы.
Создаю 2ю, так как там был другой вопрос, который скорее решен.

Вообщем суть задания - написать конструктор опросника. Потом где-то это надо сохранить.
При повторном запуске окна админа, treeView1 должен строиться по файлу, в который сохранили дерево со всеми разветвлениями до этого.
При запуске другого окна, должно быть чтение файла.
Вот, посмотрите на пример построенного дерева из файла (тут еще проблема, о которой напишу ниже) :
Кликните здесь для просмотра всего текста
Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML


В другом окне надо определить, сколько у строки подстрок. Если более одной, то создать comboBox и все подстроки загрузить в него.
В том числе и подсчитать сколько comboBox-ов создать динамически.
В идеале, создатель опросника сразу должен иметь возможность указывать, создать элемент comboBox или textBox (чтобы вручную что-нибудь вводили пользователи).

Благодаря участникам той темы, я узнал о treeView и возможности записывать это в xml.

Вообще все равно куда записывать, главное чтобы все это работало. Пока treeView с xml единственный предложенный вариант, который соответствует поставленной задаче.

Сейчас у меня проблема с сохранением и повторным чтением этого xml.
Вот как файл выглядит после сохранения (xx-xx - время начала и конца смены, просто вбил любые цифры):
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<root>
  <Выбери_график>
    <_5_2>
      <Выбери_время>
        <_35-34>
          <В_пределах_15_км_от_МКАД>
            <Да />
            <Нет />
          </В_пределах_15_км_от_МКАД>
        </_35-34>
        <_43-21 />
      </Выбери_время>
    </_5_2>
    <_2_2>
      <Выбери_время>
        <_35-34 />
        <_43-21>
          <В_пределах_15_км_от_МКАД>
            <Да />
            <Нет />
          </В_пределах_15_км_от_МКАД>
        </_43-21>
      </Выбери_время>
    </_2_2>
    <ночь>
      <Выбери_время>
        <_35-34 />
      </Выбери_время>
    </ночь>
  </Выбери_график>
</root>


Код, что его создает :
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void button4_Click(object sender, EventArgs e)
        {
            XmlDocument d = new XmlDocument();
            XmlNode n = d.CreateNode(XmlNodeType.Element, "root", null);
            foreach (TreeNode t in treeView1.Nodes)
            {
                n.AppendChild(getXmlNode(t, d));
            }
            d.AppendChild(n);
            d.Save("F:\\Documents\\Visual Studio 2017\\Projects\\test_msg\\bin\\Debug\\out.xml");
        }
 
        private XmlNode getXmlNode(TreeNode tnode, XmlDocument d)
        {
            XmlNode n = d.CreateNode(XmlNodeType.Element, tnode.Text, null);
 
            foreach (TreeNode t in tnode.Nodes)
            {
                n.AppendChild(getXmlNode(t, d));
            }
            return n;
        }


Вот код чтения и построения treeView :
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void button5_Click(object sender, EventArgs e)
        {
            XmlDataDocument doc = new XmlDataDocument();
            XmlNode xml_node;
            doc.Load("F:\\Documents\\Visual Studio 2017\\Projects\\test_msg\\bin\\Debug\\out.xml");
            xml_node = doc.ChildNodes[1];
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(new TreeNode(doc.DocumentElement.Name));
            TreeNode tree_node;
            tree_node = treeView1.Nodes[0];
            add_nodes(xml_node, tree_node);
        }
 
        public void add_nodes(XmlNode x_node, TreeNode t_node)
        {
            XmlNode xnode;
            TreeNode tnode;
            XmlNodeList node_list;
            int i;
            if (x_node.HasChildNodes)
            {
                node_list = x_node.ChildNodes;
                for (i = 0; i <= node_list.Count-1; i++)
                {
                    xnode = x_node.ChildNodes[i];
                    t_node.Nodes.Add(new TreeNode(xnode.Name));
                    tnode = t_node.Nodes[i];
                    add_nodes(xnode, tnode);
                }
            }
            else t_node.Text = x_node.InnerText.ToString();
        }


За несколько дней я уже больше ста страниц перечитал с разными вариантами записи/чтения + видосики с ютуба +о сериализации.
Перепробовал все, если и работало, то при чтении не загружался текст последнего варианта в ветке(как собственно и у меня на снимке). Часто код чтения был рассчитан на 1е разветвление, а коды записи создавали файл с различной внутренней архитектурой.
Голова закипела в итоге, удалил все и сегодня запилил то, что в спойлерах выше.
Кода мало, вроде работает.

НО!

Создается файл с проблемами - записать пробелы/слешы невозможно. Наплевал, обошелся подчеркиваниями и дефисами.
Читается с проблемой - Если ветка называется 5/2 - прочесть не может, ибо 1й символ не буква, а цифра. Плюю, будет _5_2 вместо человеческого 5/2.
Это можно исправить?

И самое главное - при чтении создается корневая ветка root, когда при создании опросника корневой было Выбери_график. И с root Уже сохранить не получается.
Как это исправить?

Что в итоге неясно:
1. Куда кроме xml можно сохранять опросник (но чтобы по нему строился treeView при повторном запуске админки)?
2. Можно ли в файле опросника дополнительно указывать, чтобы при запуске другого окна создавался comboBox или textBox?
3. Как исходя, например из моего дерева, определять, что надо создать comboBox и подгрузить в него такие-то варианты и если будет выбрано вот это, то при наличии подвариантов, создать новый comboBox.
В моем примере, названия с вариантами - это текст для label-ов над comboBox-ами. Пока не дошел до этого, но думаю можно прочесть как-нибудь)
4. Как в моем коде состыковать чтение и запись (чтобы по-человечески отображались названия без _- и при повторном построении было тоже в treeView, что и при записи)?

Умоляю, помогите, пожалуйста. Вроде задание элементарное, но проблем много...
Очень очень надеюсь на какие-нибудь подсказки.
Заранее огромное спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2018, 00:07
Ответы с готовыми решениями:

Как отключить в treeView развёртывание дерева при двойном клике по элементу дерева
Как отключить в treeView развёртывание дерева, при двойном клике по элементу дерева. нужно чтобы...

TreeView: создание динамического дерева
нужно сделать что бы были подразделы разделяющиеся на nodes и child, как это сделать? string...

TreeView. Как вывести построение дерева файлов и папок в отдельный класс?
Имеется форма &quot;Form1.cs&quot; На ней &quot;treeView1&quot;. Я создаю дерево в &quot;Form1.cs&quot; следующим кодом:...

Обход дерева treeview
Есть необходимость совершить обход каждого элемента трехуровнего treeview. Использовал код отсюда...

30
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
29.10.2018, 22:12  [ТС] 21
Author24 — интернет-сервис помощи студентам
Storm23, не хотел Вам нагрубить, извините. Просто не туда ушли.
Давайте вернемся к заданию

Использую Ваш FAQ расписал на листочке часть задания.
Перевел часть кода в классы :
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class read_excel
    {
        static txt help_txt = new txt();
        static who help_who = new who();
 
        string connStr = @"Provider=Microsoft.ACE.OleDb.12.0; data source="+help_txt.get_input()+"; Extended Properties=Excel 12.0";
 
        public string ole_emp()
        {
            var oleConnection = new OleDbConnection(connStr);
            oleConnection.Open();
            var oleCommand = new OleDbCommand("SELECT [ФИО] FROM [Лист1$] WHERE [winlogin] LIKE '" + help_who.WinLog() + "'", oleConnection);
            oleConnection.Close();
            return oleCommand.ExecuteScalar().ToString();
        }
 
        public string ole_otdel()
        {
            var oleConnection = new OleDbConnection(connStr);
            oleConnection.Open();
            var oleCommand = new OleDbCommand("SELECT [Отдел] FROM [Лист1$] WHERE [winlogin] LIKE '" + help_who.WinLog() + "'", oleConnection);
            oleConnection.Close();
            return oleCommand.ExecuteScalar().ToString();
        }
 
    }

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class txt
    {
        string[] main;
        string path = \\folder\\";
 
        public string get_input()
        {
            main = File.ReadAllLines(path+"settings\\main.txt", Encoding.Default);
            return main[0];
        }
 
        public string get_uotput()
        {
            main = File.ReadAllLines(path + "settings\\main.txt", Encoding.Default);
            return main[1];
        }
    }

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
 class who
    {
 
        public string WinLog()
        {
            return Environment.UserName;
        }
 
    }


Похоже на воплощение модели в код?

Umatkot_Primtep, Storm23, Usaga, Woldemar89,
Вы советуете забыть про внешний вид, продумать логику. Действительно, я дурак, увлекся GUI сразу.

Благодаря этой теме, трудностями в процессе написания, я наконец начал заранее думать о принципах ООП. Классы выше тому подтверждение.

Сейчас буду строить эту саму модель.
Только очень прошу объяснить одно (можете называть дураком, не обижусь, так и есть (пока)) - как можно строить классы, не зная что будет отражено у пользователя, как будут создавать опросник?

Я ни с кем не спорю, просто очень хочу понять вот это :
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Так вот, вы пытаетесь хранить и обрабатывать данные в мониторе
сама задача - админ (человек) должен визуально в моей проге создавать эту зависимость. Подходит только один элемент, измученный treeView.
Уже результаты treeView мы сохраняем, в xml.
Даже если будет класс, ведь через него все равно будут сохраняться данные в xml.
В самом treeView, визуально админом, задается зависимость, названия и т.п.

В силу малого опыта с кодом, далеко сложно продумать.
Нельзя забывать и о внешнем виде, и о том, как будет сохраняться при создании модели.
Так вот, как делать одно, не зная, как будет остальное реализовано?

Укажите, где я думаю неправильно, пожалуйста.
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
29.10.2018, 22:21 22
Цитата Сообщение от MIRAMIX Посмотреть сообщение
Укажите, где я думаю неправильно, пожалуйста.
Цитата Сообщение от MIRAMIX Посмотреть сообщение
сама задача - админ (человек) должен визуально в моей проге создавать эту зависимость
Вы должны думать о том, какая структура данных или объект (а не какой UI контрол!!!)
максимально подходит для описания или хранения того, что вы называете "зависимость".
Очередь, дерево, связный список, их комбинация\переопределение, свой класс итд.
1
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
30.10.2018, 03:57 23
MIRAMIX, почитайте вот это. это даст вам некоторое представление об ООП очень простым и наглядным примером.
http://artanovy.com/2011/03/pr... rovannogo/

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

Добавлено через 3 минуты
Цитата Сообщение от MIRAMIX Посмотреть сообщение
Так вот, как делать одно, не зная, как будет остальное реализовано
А вы представляете, как строят небоскрёбы? Как начинают делать фундамент не зная, что на высоте 500 метров будет дуть сильный ветер?
https://ru.wikipedia.org/wiki/... %D0%B9_101
1
Эксперт .NET
12309 / 8678 / 1310
Регистрация: 21.01.2016
Сообщений: 32,609
30.10.2018, 06:03 24
Цитата Сообщение от MIRAMIX Посмотреть сообщение
Похоже на воплощение модели в код?
Нет.

Цитата Сообщение от MIRAMIX Посмотреть сообщение
Только очень прошу объяснить одно (можете называть дураком, не обижусь, так и есть (пока)) - как можно строить классы, не зная что будет отражено у пользователя, как будут создавать опросник?
Опросник, как идея, существует ещё до воплощения его в бумаге, в виде приложения (десктопное, консольное, веб-приложение) или в виде экзамена словесного. Т.е. опросник - он один, но реализовать его самыми разным способами без изменения общего смысла.

Вам предложили сделать тоже самое. Перечислить все объекты-участники вашего приложения, определить связи между ними и уже только потом оборачивать в инфраструктурные решения в виде сохранения в XML и визуализацию.

Я, на вскидку, вижу это так: класс Questionnaire (опросник), в нём коллекция Question (вопрос), каждый из которых содержит в себе коллекцию AnswerOption (вариант ответа), в каждом из которых может быть признак верный он или нет. Так же, в опроснике может быть коллекция ключ-значение из пар вопрос-вариант_ответа (KeyValuePair<Question, AnswerOption>) или иной подход для формирования ответов на вопросы.

Вот и всё. Это ваша модель опросника. Никакой завязки ни на способ хранения, ни на способ визуализации. Визуализация этого дела: перебор коллекции вопросов в классе опросника и вывод на экран. В каждом вопросе есть коллекция вариантов ответа, их тоже можно выводить. Надеюсь идея ясна?
2
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
30.10.2018, 07:11 25
Цитата Сообщение от Usaga Посмотреть сообщение
Я, на вскидку, вижу это так: класс Questionnaire (опросник), в нём коллекция Question (вопрос), каждый из которых содержит в себе коллекцию AnswerOption (вариант ответа), в каждом из которых может быть признак верный он или нет. Так же, в опроснике может быть коллекция ключ-значение из пар вопрос-вариант_ответа (KeyValuePair<Question, AnswerOption>) или иной подход для формирования ответов на вопросы.
Вот и всё. Это ваша модель опросника.
MIRAMIX, Видите, как он описал модель? Он представил себе структуру, которая будет иметь какие-то взаимодействия между своими компонентами. Так как модель взаимодействия может быть разной на самом деле (это как вариант), то и в общем это является моделью, моделью классов, моделью бизнес логики. Если придерживаться данной модели, то она будет сама являться или блоком архитектуры - более сложной модели приложения. Сейчас была декомпозиция, которая позволила выделить не только элементы, но и ещё предполагаемых характер взаимодействия между ними сразу. Если это отобразить в виде UML или других моделей проектирования, то можно будет увидеть весь рабочий процесс и оценить его - и это всё без единой строчки кода.

Допустим, в своей модели, которую я показал выше нет вариантов ответов - правильные они или нет. Как бы я мог выйти из той ситуации? Я бы мог создать класс Repetitor, который мог бы отслеживать все опросы и проверять, кто на сколько что ответил - это был бы дополнительный компонент, он бы имел свою свободу действий и мог бы иметь доступ как к одному сеансу опроса, так и ко всем сразу для составления, например, отчётов.

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

Добавлено через 6 минут
Цитата Сообщение от Umatkot_Primtep Посмотреть сообщение
в каждом из которых может быть признак верный он или нет
не знаю даже, если будет идти древовидная зависимость следующего вопроса, то смысл верного варианта на промежуточном этапе как бы не должно быть, так как ведёт каждый вариант к новому варианту, который по циклу, в итоге приводит не к верному или не верному варианту, а к решению - конец пути.
Вопрос 1
|
|
|-Вариант 1(он же вопрос(влечёт за собой другой вопрос))
| |
| |
| |-Вариант 1.1(он тоже вопрос(влечёт за собой другой вопрос))
| | |
| | |-Конечная точка в дереве вариантов - путь Вопрос\1.1\Окончательный ответ
| | |-Конечная точка в дереве вариантов 2 - путь Вопрос\1.1\Окончательный ответ 2
|-Вариант 2 и т.д.
1
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.10.2018, 00:07 26
Лучший ответ Сообщение было отмечено MIRAMIX как решение

Решение

Цитата Сообщение от MIRAMIX Посмотреть сообщение
не подсказываете как можно иначе
Здесь: Создание программы - ООП модель, MVP
1
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
31.10.2018, 00:21  [ТС] 27
Woldemar89, Umatkot_Primtep, Usaga, Storm23,
спасибо))
дошло наконец. осталось переварить (после процедурного сложно мыслить иначе) и готово.
тупил жестко, но того стоило
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
31.10.2018, 04:11 28
Цитата Сообщение от Storm23 Посмотреть сообщение
Здесь: Создание программы - ООП модель, MVP
с ума сойти!!! а я то подумал, что интерес к задаче потеряли уже)
1
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
31.10.2018, 08:04  [ТС] 29
Storm23, Umatkot_Primtep,
кстати, я сразу то и не посмотрел на дату создания.
действительно, с ума сойти! снимаю шляпу)
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
31.10.2018, 08:31 30
MIRAMIX,

Не по теме:

да неожиданно

1
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
06.11.2018, 02:09  [ТС] 31
Всем огромнейшее спасибо за различные рекомендации/подсказки.
Лучшее решение выше, Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML
Дальнейшее обсуждение касаемо опросника уже там.
0
06.11.2018, 02:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2018, 02:09
Помогаю со студенческими работами здесь

Вывод B-дерева в контрол TreeView
Уважаемые форумчане, мне очень нужна ваша помощь, помогите пожалуйста организовать вывод B-tree в...

Заполнение дерева (treeview) рекурсией
подскажите как заполнить treeview рекурсивно... Есть Class1{ id name и т д поля parentId }...

Обход дерева в treeView. Подсчёт вероятностей
Здравствуйте! Вот какая проблема:есть дерево(с любым кол-ом детей), храню его в TreeView. Есть...

TreeView Отследить удаления элемента дерева
Необходимо, когда удаляется элемент из дерева, выполнить некоторые действия, связанные с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru