#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
||||||||||||||||
1 | ||||||||||||||||
Опросник. Создание дерева зависимостей в treeView, сохранение дерева в XML, построение дерева в treeView из XML27.10.2018, 00:07. Показов 6095. Ответов 30
Всем доброго времени суток.
Тема является продолжением вот этой темы. Создаю 2ю, так как там был другой вопрос, который скорее решен. Вообщем суть задания - написать конструктор опросника. Потом где-то это надо сохранить. При повторном запуске окна админа, treeView1 должен строиться по файлу, в который сохранили дерево со всеми разветвлениями до этого. При запуске другого окна, должно быть чтение файла. Вот, посмотрите на пример построенного дерева из файла (тут еще проблема, о которой напишу ниже) : В другом окне надо определить, сколько у строки подстрок. Если более одной, то создать comboBox и все подстроки загрузить в него. В том числе и подсчитать сколько comboBox-ов создать динамически. В идеале, создатель опросника сразу должен иметь возможность указывать, создать элемент comboBox или textBox (чтобы вручную что-нибудь вводили пользователи). Благодаря участникам той темы, я узнал о treeView и возможности записывать это в xml. Вообще все равно куда записывать, главное чтобы все это работало. Пока treeView с xml единственный предложенный вариант, который соответствует поставленной задаче. Сейчас у меня проблема с сохранением и повторным чтением этого xml. Вот как файл выглядит после сохранения (xx-xx - время начала и конца смены, просто вбил любые цифры): Кликните здесь для просмотра всего текста
Код, что его создает : Кликните здесь для просмотра всего текста
Вот код чтения и построения treeView : Кликните здесь для просмотра всего текста
За несколько дней я уже больше ста страниц перечитал с разными вариантами записи/чтения + видосики с ютуба +о сериализации. Перепробовал все, если и работало, то при чтении не загружался текст последнего варианта в ветке(как собственно и у меня на снимке). Часто код чтения был рассчитан на 1е разветвление, а коды записи создавали файл с различной внутренней архитектурой. Голова закипела в итоге, удалил все и сегодня запилил то, что в спойлерах выше. Кода мало, вроде работает. НО! Создается файл с проблемами - записать пробелы/слешы невозможно. Наплевал, обошелся подчеркиваниями и дефисами. Читается с проблемой - Если ветка называется 5/2 - прочесть не может, ибо 1й символ не буква, а цифра. Плюю, будет _5_2 вместо человеческого 5/2. Это можно исправить? И самое главное - при чтении создается корневая ветка root, когда при создании опросника корневой было Выбери_график. И с root Уже сохранить не получается. Как это исправить? Что в итоге неясно: 1. Куда кроме xml можно сохранять опросник (но чтобы по нему строился treeView при повторном запуске админки)? 2. Можно ли в файле опросника дополнительно указывать, чтобы при запуске другого окна создавался comboBox или textBox? 3. Как исходя, например из моего дерева, определять, что надо создать comboBox и подгрузить в него такие-то варианты и если будет выбрано вот это, то при наличии подвариантов, создать новый comboBox. В моем примере, названия с вариантами - это текст для label-ов над comboBox-ами. Пока не дошел до этого, но думаю можно прочесть как-нибудь) 4. Как в моем коде состыковать чтение и запись (чтобы по-человечески отображались названия без _- и при повторном построении было тоже в treeView, что и при записи)? Умоляю, помогите, пожалуйста. Вроде задание элементарное, но проблем много... Очень очень надеюсь на какие-нибудь подсказки. Заранее огромное спасибо.
0
|
27.10.2018, 00:07 | |
Ответы с готовыми решениями:
30
Как отключить в treeView развёртывание дерева при двойном клике по элементу дерева TreeView: создание динамического дерева TreeView. Как вывести построение дерева файлов и папок в отдельный класс? Обход дерева treeview |
27.10.2018, 11:33 | 3 |
Сообщение было отмечено MIRAMIX как решение
Решение
MIRAMIX, проблемы с именами происходят от того, что ты создал неудачный формат хмл. Просто выводимый текст не нужно делать именем хмл, поскольку для имен здесь, как и в любом языке, имеются ограничения. Можно имена сделать одинаковыми, например node, а текст для вывода на экран хранить в атрибуте text.
Во вложении небольшой пример, использующий такой подход. Я взял приведенный тобой пример файла, преобразовал его в описанный выше формат(xslt прилагается) и с него загружаю данные. Для сохранения используется SaveFileDialog, но это, естественно, для примера, чтобы можно было увидеть, что сохраняется то, что нужно. Насчет всех этих комбобоксов и прочего - я мало что понял. Допили проект, чтобы там все это было и уже на "живом" примере все проще будет объяснить.
1
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|
27.10.2018, 21:41 [ТС] | 4 |
ashsvis, а дерево можно там сохранить, да так, чтобы цепочка в другом окне по comboBox-ам развертывалась?
0
|
27.10.2018, 21:51 | 5 |
Эхх...
1) Во-первых, где модель данных? Тривью - это визуальный контрол, xml - формат файла. А модель где? 2) Создав модель данных отпадет и проблема xml-ов, потому что модель можно будет просто сериализовать. 3) Почему вы выбрали дерево как структуру опросника? Ведь у вас одни и те же вопросы повторяются много раз в разных ветках ("выбери время", "в пределах.."). На мой взгляд, опросник это линейная структура. Вот вопросы, которыми вам нужно заниматься, а не treeview мучить.
1
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|
27.10.2018, 22:12 [ТС] | 6 |
Storm23,
1. Что за модель?) Исходя из выбора среди одних вариантов, надо предоставить выбор других вариантов и т.д. в комбобоксе. 3. По-моему нет альтернатив. Опросник будет строить человек. Дальше надо сохранить иерархию. Я не имею ни грамма представления, как можно иначе все это сохранить. Благодаря участникам из другой темы, появился единственный вариант, за который я схватился. Понимаете, админ должен строить цепочку зависимостей как на моих примерах. Потом из этого же файла другие окна подтягивают результаты. Да, повторяются, но одни и те же вопросы распространяются не на все предыдущие варианты. Реальный пример - вопрос "км от МКАД" не распространяется на часть смен. Добавлено через 1 минуту diadiavova, Огромнейшее Вам спасибо!!! Несколько строк и вауля. В шоке просто) Если сейчас не справлюсь с задуманным, еще раз распишу здесь остальной механизм)
0
|
28.10.2018, 00:00 | 7 |
Почитайте здесь Архитектура ПО в WinForms (FAQ & HowTo)
Это делается фильтрацией. А повторение одних и тех же вопросов в разных ветках, которые будут экспоненциально множиться - это верх абсурда. Повторяю, опросник - линейная структура. Вам не нужно дерево.
2
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|
28.10.2018, 00:10 [ТС] | 8 |
Storm23, этого и ждал, что подскажут как вообще этот каркас построить))
спасибо, почитаю)
0
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|
28.10.2018, 19:47 [ТС] | 9 |
Storm23, очень дельные советы, огромное спасибо, кратко и полезно. Я как раз собирался перестроить код с процедурного принципа на ООП (с самого начала знакомства с WF подсел на процедурный принцип, надо убегать). Это не так сложно будет.
ashsvis, diadiavova, Storm23, Сейчас самая важная проблема - сохранение опросника, чтобы по его иерархии строились comboBox-ы в другой форме. Вкратце - посмотрите на самый первый мой снимок. Как должно быть - появляется comboBox (cb дальше) с 5/2 / 2/2 / ночь. Если выбрать 2/2 - появляется 2й cb с графиками по этому режиму. Исходя из выбора, зависит появление вопроса про км от МКАД и т.д. Что можете посоветовать в плане визуального построения опросника кроме treeView? И есть альтернатива сохранения в xml, чтобы другая форма с cb считывала алгоритм? ashsvis, посоветовал ini. Интересно. Только я далеко не вижу. С этим способом лучше/хуже? Я буду очень рад советам опытных программистам, но как уже сказал, пока treeView с xml единственный способ, с которым можно (надеюсь) реализовать задуманное. И к тому же, мне даже это подсказали. Спасибо. Добавлено через 1 минуту не понимаю
0
|
Storm23
|
28.10.2018, 20:25
#10
|
Не по теме: MIRAMIX, похоже вы так ничего и не поняли, ну ... успехов.
0
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|
28.10.2018, 21:21 [ТС] | 11 |
Storm23, по ссылке на FAQ на мой вопрос ответа нет.
Вы не согласны с единственным предложенным мне вариантов реализации, но и не подсказываете как можно иначе. Знал бы, обоих тем бы не было...
0
|
28.10.2018, 23:34 | 12 |
Так а какой ответ вы там ожидали увидеть? Вы просто задаете не те вопросы. Понимаете, вы не занимаетесь разработкой программы. Вы просто тоните в визуале, а самой программы у вас нет. Потому что программа - это модель классов, это структуры данных, это функционал, это сериализация данных, это связи между классами, это сервисы, это импорт-экспорт данных.
Вот какие вопросы вам нужно перед собой ставить. А вы занимаетесь просто построением самолета из соломы, пытаясь соcтряпать все вышеперчисленное из treeview. Вот например, где у вас прохождение опросника? То есть заполнение анкеты, не конструктор а именно заполнение. У вас же его нет. А вот интересно, как вы его сделаете, если ваша "анкета" хранится в treeview? Вы будете этот treeview показывать респонденту? Как он будет заполнять анкету? А еще, у вас в дереве куча одинаковых вопросов. А как вы потом будете обрабатывать информацию, если у вас один и тот же вопрос разбросан по десяткам мест? А как вы свяжите собственно ответ на вопрос с самим опросником? Ведь у вас опять же один и тот же вопрос - во многих местах? Создайте новую тему, подробно опишите задачу.
1
|
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
|
||||||||||||||||
29.10.2018, 05:14 | 13 | |||||||||||||||
Если кому-то интересно, как бы начал делать я, например, то вот некоторые наброски
По такой постановке можно сделать следующее: Для хранения данных есть таблица[Ответы], которая содержит в себе: [ID], [QUESTION], [ANSWER], [PARENT], [VARIANTS] 1, 'день недели', 'пн', NULL, TRUE 2, 'день недели', 'вт', NULL, TRUE 3, 'день недели', 'ср', NULL, TRUE и т.д. 4, 'что ел на завтрак', 'каша', 'пн', TRUE 5, 'что ел на завтрак', 'суп', 'пн', TRUE 6, 'что ел на завтрак', 'пицца', 'пн', TRUE 7, 'укажите количество калорий', '', 'пицца', FALSE Это всё дело помещается в DataTable, пишется класс - он будет QuestionMaster Кликните здесь для просмотра всего текста
В нём будет метод - GetQuestion(Question) Сам Question - это структура вопроса - она отражает данные на ваш код в C# Кликните здесь для просмотра всего текста
На форме, по кнопке "Начать задавать вопросы" вставить Кликните здесь для просмотра всего текста
Это как скелет приложения и это только процесс самого опроса. Генерация опроса включает в себя также заполнение QuestionMaster.Store новыми элементами. Вообще, не хватает добавления новой строки в таблицу и ещё некоторых деталей, но я не хочу всё досконально делать за ТС, тут уже можно самому допиливать, так как я показал только куда можно рулить. Также не хватает организации ответа на вопрос, если используется TextBox, а не комбобокс, тут уже варианты на усмотрение программиста - либо таблицу добавить с ответами конкретного пользователя, либо какой-то другой вариант.
1
|
29.10.2018, 09:10 | 14 |
Umatkot_Primtep,
ИМХО. Такой подход как у вас в принципе имеет право на жизнь. Но это не ООП подход. Это процедурное программирование, замешанное на реляционные базы данных. Имеет все те же фатальные недостатки: 1) Нет модели данных в смысле ООП. Есть только таблицы. Но таблицы - очень ограниченное средство выражения данных, со своими (существенными) ограничениями. Используя БД как модель предметной области у вас развивается "плоское табличное мышление", связанное с ограничениями реляционных БД. Я хочу в программе использовать не только списки (aka Таблицы), но и словари, хеш-таблицы, очереди и стеки, деревья и т.д. Всего этого в БД нет. В БД также нет функционала, то есть обработка данных оторвана от самих данных, и этот функционал вам нужно будет реализовать в коде, и он будет плохо ложиться на таблицы. Это как конструировать автомобиль вокруг выхлопной трубы. Я уже не говорю про то, что вы теряете всю мощь ООП подхода. У вас не будет ни наследования, ни интерфейсов, ни инкапсуляции, ни полиморфизма, ни паттернов, то есть ничего того, чем живет программирование последние лет 20. 2) СУБД это в первую очередь средство хранения данных. Хранить данные там удобно, обрабатывать их - нет. Поэтому для работы с БД популярны ORM, которые позволяют работать и с классами и с таблицами БД. В любом случае, даже если не использовать ORM нужно делать прослойку в виде POCO/DTO объектов. Без классов и объектов в современном C# делать нечего. (Да, я вижу, что вас есть DTO, но это просто размышления в целом) И еще раз, такой подход может быть, но только для простейших CRUD систем. Любая логика сложнее CRUD будет выглядеть как мучительный костыль. PS Я не внедряюсь в вашу конкретную реализацию, хотя там есть ошибки. Например, у вас "Parent" завязан на строку, которых может быть несколько в таблице, ну и куча других багов, которые сделают эту систему нежизнеспособной.
3
|
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
|
|
29.10.2018, 09:37 | 15 |
Storm23, Да. Сначала я хотел показать пример работы с ORM, но потом осёкся тем, что ORM не позволяет делать подключение к XML как к источнику данных.
Пример не проверял - сделал без студии, прям тут, так что особо не ругайте по багодельне - проверок не было - это я продемонстрировал пример, что пока толку от дерева TreeView не будет пока не будет организована правильная работа с данными. Покажите, что тут можно применить из ООП, сам поучусь. Добавлено через 4 минуты Это делается для того, чтобы выбирались только те вопросы на данном этапе, которые имеют смысл, так проверка то идёт по одному полю - PARENT - ANSWER - это я не серьёзно так думаю - это наглядный пример. Я бы сделал всё-равно через ORM и по другому ключу привязку. Также я написал, что недоработана структура с ответами пользователей, нет разделения по пользователям, вообще ничего - просто набросок механизма именно самого процесса опроса. Автора ввело ступор слово "делайте фильтрацию" - я попытался показать, что такое фильтрация.
2
|
12309 / 8678 / 1310
Регистрация: 21.01.2016
Сообщений: 32,606
|
|
29.10.2018, 09:47 | 16 |
Storm23 вам предложил продумать внутреннее представление вашего опросника. Всю совокупность классов с данными (вопросами, ответами и прочим) и сервисами, что эти данные умеют обрабатывать. Это и есть та самая "Модель". У модели есть чумовое свойство: она не завязана ни на визуальное представление, ни на способ хранения.
Вы сейчас плящете от визуализации. Но визуализировать у вас тупо нечего. Всё равно, что пытаться покрасить автомобиль, который ещё не изготовлен. Модели не нужен UI, она может существовать и без этого. Но UI, которому нечего показывать - бесполезен. Вы не с той стороны начали задачу решать. Спроектируйте представление своего опросника. Классы под вопросы, ответы. Логики их взаимодействия. Это важнее TreeView.
2
|
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
|
|
29.10.2018, 10:10 | 17 |
MIRAMIX, по - хорошему разработка программы не значит начать сразу программировать, а приступить к постройке именно фундамента - моделей. Модели есть UML, есть модели описания процессов - всё можно разработать и проработать до первой строчки кода. Но это не просто прочесть книгу. Раньше была хорошая система Borland ECO - она позволяла генерировать классы из моделей, но уже работающий прототип - принцип был в том, что не будет ни одной строки кода, пока не будет реализована именно модель. Вам надо написать модели прецедентов, бизнес-модели, модели классов - уже с некоторых сторон осветить то, что будет делать программа не используя ни один язык программирования. Вот это будет ТЗ. Программисту останется только разложить ТЗ как ноты и начать программировать не думая о том, что проще с чем связать и как это должно работать. А вот реализация узлов - уже ложится на его плечи (выбора алгоритма сортировки, выбора способа обращения к данным и другие технические более детальные вопросы(также связанные с конкретным языком и реализации)) Проектировать систему намного сложнее, чем её программировать(вот тут меня могут закусать, не кусайте сильно, пожалуйста). Иногда архитектурные ошибки способны убить множество строк кода и месяцев, потраченных на реализацию по готовому ТЗ. Обычно их не так много, но случается по неполноте поступающих данных от заказчиков, что переделывют вообще проекты, если не с 0ля, то большую часть, но опытный разработчик должен предусматривать эти моменты - поэтому они ценятся намного больше обычных кодеров. Сейчас нужно спроектировать все узлы, а потом уже начать думать, что там применить TreeView или тупую таблицу - в итоге, как отметил Usaga, всё равно отображение модели не будет связано с её сущностью. Тут уже более серьёзный подход получается.
Конечно, в демонстрации я нарушил все принципы, но цель была не в этом. Я бы сам не прочь бы посмотреть на грамотную организацию как раз моделей этого чуда.
1
|
#MRoose
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
|
|
29.10.2018, 17:04 [ТС] | 18 |
Storm23, не понимаю, зачем разбрасываться умными словами, когда я некоторые элементарные вещи тут спрашиваю...к чему понты, когда видно, что уровень знаний разный. Говорите про модель - даете ссылку - возносите ООП.
Зачем так заморачиваться с ООП, классами? Они тут вообще не нужны. Уже есть рабочий код сохранения treeView. Остается придумать как считывать. Umatkot_Primtep, Usaga, Storm23, сам плююсь от своей идеи в плане кода. Спасибо за пример, Umatkot_Primtep. Ну что ж, если модель это не только классы, что-то такое важное (в чем сомневаюсь в отношении моего ТЗ), пойду хоть узнаю что это. Вот мои 2 самых интересных проекта. Без всяких моделей/классов прекрасно работает. Спасибо всем за примеры, пойду изучать Ваши рекомендации, переписывать код с процедурного типа на ООП (мало, но ок). Тему закрывать не буду, отпишусь позже))
0
|
Storm23
|
29.10.2018, 20:06
#19
|
0
|
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
|
|
29.10.2018, 20:45 | 20 |
MIRAMIX, вам указали на то, что TreeView средство отображения данных, а не место их хранения, и, тем более, не место для реализации логики.
Приведу еще одну аналогию в дополнение к предложенной Usaga: Вы конструируете компьютер: Системный блок - это устройство для хранения данных и реализации логики (он может быть подключен к монитору, проектору и телевизору) Монитор, проектор и телевизор - это средства отображения данных. Так вот, вы пытаетесь хранить и обрабатывать данные в мониторе Забудьте пока про UI, TreeView, XML, итд Начните с построения логики, например на основе ООП, продумайте сущности. У вас они будут следующие (пример): Вопрос, анкета, опросник. анкета содержит вопросы и роутинг между ними, опросник содержит анкеты, вопрос содержит текст вопроса, тип ответа (один пункт или много, строка итп), сам ответ Далее создайте C# абстракцию: интерфейсы, абстрактые классы, на их основе классы Question.cs, Questionary.cs, Inquirer.cs итд Другими словами опишите логику. А вот когда это уже будет работать (напр. консольное тестовое приложение или unit-тесты) Натягивайте это хоть на валенок и сериализуйте во что вам угодно.
2
|
29.10.2018, 20:45 | |
29.10.2018, 20:45 | |
Помогаю со студенческими работами здесь
20
Вывод B-дерева в контрол TreeView Заполнение дерева (treeview) рекурсией Обход дерева в treeView. Подсчёт вероятностей TreeView Отследить удаления элемента дерева Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |