| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > Добавление ноды в TreeView и в XML одновременно. |
| Автор: valzy 20.11.2008, 12:19 |
| Собственно, нужно чтобы при добавлении ноды в TreeView обновлялся документ XML. TreeView связан с XML документом таким образом, что TreeView строится из XML-документа. Соответственно при добавлении в TreeView документ XML должен обновляться. Строить XML на основе TreeView это плохое решение. Кто-нибудь знает конкретные методы решения подобной проблемы? Напишите, плиз, буду очень благодарен. |
| Автор: Rififi 20.11.2008, 12:22 |
| Сделать свой контрол на основе TreeView, в котором синхронизировать обновление |
| Автор: valzy 20.11.2008, 12:44 | ||
С чего нужно примерно начать и как синхронизировать? Понятия "Абсолютного индекса" для TreeView здесь уже нет. Я на dotnet недавно, нужна помощь... |
| Автор: diadiavova 20.11.2008, 13:54 |
| А можно небольшое уточнение? Почему ИМХО: оно самое лучшее. Вопрос в том, как оно будет реализовано. |
| Автор: valzy 21.11.2008, 09:39 |
| нужно чтобы дерево вида +<object> | |---+<table> | |---+ATTRIBUTE: width | | |---VALUE: 100 | | | |---+ATTRIBUTE: height | | |---VALUE: 70 | | | |---+<object> | |---+<cabinet> | |---+ATTRIBUTE: count | |---VALUE: 3 | |---+<table> |---+ATTRIBUTE: width |---VALUE: 120 было сгенерировано в xml вида <object> <table width="100" height="70"> <object> <cabinet count="3"/> </object> </table> <table width="120" /> </object> |
| Автор: diadiavova 21.11.2008, 12:39 |
| Да всё очень просто: как сам TreeView так и его TreeNode'ы могут быть унаследованы. Создай несколько своих нодов, ну например нод, который будет сохраняться как элемент, и нод, который будет сохраняться как атрибут для остальных типов узлов можно сделать то же самое, кроме того, каждому можно добавить методы и свойства, благодаря которым каждый узел будет правильно генерировать узел документа. |
| Автор: valzy 21.11.2008, 13:02 | ||
Оригинально Примерно я понял, если бы можно было бы, хотелось бы увидеть простенький пример, я недавно с dotNet-ом работаю... |
| Автор: shmarov 21.11.2008, 13:38 | ||
к примеру - ноды наследовать вот так:
ну а дальше - наследуй TreeView и в методах изменения ноды генери свой XML Как вариант - я расширял TreeView свойством DataSource, в котором в нужной мне форме хранил данные и разбирал их соответственно. А у DataSet, который можно указать в качестве значения для DataSource-a, есть метод сохранения XML. Вопрос только подойдёт ли тебе такой подход по структуре получаемого файла. |
| Автор: diadiavova 21.11.2008, 20:24 |
| Ну, вообще-то можно всё сделать более удобным. Просто я уже почти сделал и тут у меня свет вырубило, а сохранить не успел, так что: если потерпишь малость то сделаю потом примерчик(если, конечно вопрос ещё актуален). |
| Автор: diadiavova 21.11.2008, 23:26 |
| Ну вот тут проектик надросал. |
| Автор: valzy 24.11.2008, 07:20 |
| Благодарю! Не код, а произведение искусства! |
| Автор: valzy 25.11.2008, 08:20 | ||
| А если XML-ка содержит контент, ну т.е. текст: <object> <content>Столы<br />Шкафчики <table width="100" height="70"> <object> <cabinet count="3"/> </object> </table> <table width="120" /> </content> </object> то как с этим текстом поступить? я просто проверял тип ноды на соответствие XmlNodeType.Text. Если по сорцам diadiavova смотреть, то вот так я изменил (изменения кода см. в блоке комментариев //---):
|
| Автор: diadiavova 25.11.2008, 12:53 | ||||
| Обрати внимание на то, что некоторые коды я в своём примере не использовал вообще(хотя сам же и написал их). Например: создал абстрактный класс для всех узлов, в нём есть свойство, показывающее тип узла, которое я ни разу не использовал. Всё это делалось для того, чтобы модель можно было расширить при необходимости. Если тебе нужно включить в модель текстовый блок, блок CDATA, инструкцию приложения, или к примеру элемент, который должен вести себя по-другому - всё это можно организовать путём наследования от абстрактного класса XmlTreeNode. Естественно: Некоторых изменений это потребует и в существующих классах, но они незначительны. Вот так примерно должен выглядеть текстовый узел
Естественно, что он будет отображать - решать тебе, в таком виде в дереве просто будет написано #text, нужно что-то другое - пропиши это в конструкторе. Кроме того, в конструкторе ElementNode надо указать, что если узел документа является текстовым, то надо формировать соответствующий элемент.
Примерно так. Код не проверял, но если идея ясна, то возможные ошибки исправишь сам. |
| Автор: valzy 26.11.2008, 07:51 |
| |