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

Поиск:

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


Новичок



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

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



Собственно, нужно чтобы при добавлении ноды в TreeView обновлялся документ XML.
TreeView связан с XML документом таким образом, что TreeView строится из XML-документа. Соответственно при добавлении в TreeView документ XML должен обновляться.
Строить XML на основе TreeView это плохое решение. Кто-нибудь знает конкретные методы решения подобной проблемы? Напишите, плиз, буду очень благодарен.
PM MAIL   Вверх
Rififi
Дата 20.11.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

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



Сделать свой контрол на основе TreeView, в котором синхронизировать обновление
PM MAIL   Вверх
valzy
Дата 20.11.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Rififi @ 20.11.2008,  12:22)
Сделать свой контрол на основе TreeView, в котором синхронизировать обновление

С чего нужно примерно начать и как синхронизировать? Понятия "Абсолютного индекса" для TreeView здесь уже нет. Я на dotnet недавно, нужна помощь...
PM MAIL   Вверх
diadiavova
Дата 20.11.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



А можно небольшое уточнение? Почему

Цитата(valzy @  20.11.2008,  12:19 Найти цитируемый пост)
Строить XML на основе TreeView это плохое решение.


ИМХО: оно самое лучшее. Вопрос в том, как оно будет реализовано.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
valzy
  Дата 21.11.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



нужно чтобы дерево вида
+<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>



Это сообщение отредактировал(а) valzy - 21.11.2008, 09:41
PM MAIL   Вверх
diadiavova
Дата 21.11.2008, 12:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Да всё очень просто: как сам TreeView так и его TreeNode'ы могут быть унаследованы. Создай несколько своих нодов, ну например нод, который будет сохраняться как элемент, и нод, который будет сохраняться как атрибут для остальных типов узлов можно сделать то же самое, кроме того, каждому можно добавить методы и свойства, благодаря которым каждый узел будет правильно генерировать узел документа.




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
valzy
Дата 21.11.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(diadiavova @ 21.11.2008,  12:39)
Да всё очень просто: как сам TreeView так и его TreeNode'ы могут быть унаследованы. Создай несколько своих нодов, ну например нод, который будет сохраняться как элемент, и нод, который будет сохраняться как атрибут для остальных типов узлов можно сделать то же самое, кроме того, каждому можно добавить методы и свойства, благодаря которым каждый узел будет правильно генерировать узел документа.

Оригинально smile а как наследовать ноды?
Примерно я понял, если бы можно было бы, хотелось бы увидеть простенький пример, я недавно с dotNet-ом работаю...
PM MAIL   Вверх
shmarov
Дата 21.11.2008, 13:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



к примеру - ноды наследовать вот так:
Код

public class SimpleTreeNode : System.Windows.Forms.TreeNode
    {
        int _id;
        string _alterText;

        public SimpleTreeNode(string Text, int ID)
        {
            this.Text = Text;
            _id = ID;
        }

        public string AlternativeText
        {
            set
            {
                _alterText = value;
            }
            get
            {
                return _alterText;
            }
        }

        /// <summary>
        /// Идентификатор
        /// </summary>
        public int ID
        {
            set
            {
                _id = value;
            }
            get
            {
                return _id;
            }
        }
    }


ну а дальше - наследуй TreeView и в методах изменения ноды генери свой XML

Как вариант - я расширял TreeView свойством DataSource, в котором в нужной мне форме хранил данные и разбирал их соответственно. А у DataSet, который можно указать в качестве значения для DataSource-a, есть метод сохранения XML. Вопрос только подойдёт ли тебе такой подход по структуре получаемого файла.
PM MAIL   Вверх
diadiavova
Дата 21.11.2008, 20:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну, вообще-то можно всё сделать более удобным. Просто я уже почти сделал и тут у меня свет вырубило, а сохранить не успел, так что: если потерпишь малость то сделаю потом примерчик(если, конечно вопрос ещё актуален).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 21.11.2008, 23:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну вот тут проектик надросал.

Присоединённый файл ( Кол-во скачиваний: 40 )
Присоединённый файл  TreeXml.zip 50,35 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
valzy
  Дата 24.11.2008, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Благодарю! Не код, а произведение искусства! 
PM MAIL   Вверх
valzy
Дата 25.11.2008, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А если XML-ка содержит контент, ну т.е. текст:
<object>
  <content>Столы<br />Шкафчики
    <table width="100" height="70">
       <object>
           <cabinet count="3"/>
       </object>
    </table>
    <table width="120" />
  </content>
</object>

то как с этим текстом поступить? я просто проверял тип ноды на соответствие XmlNodeType.Text.
Если по сорцам diadiavova смотреть, то вот так я изменил (изменения кода см. в блоке комментариев //---):

Код

public class ElementNode : XmlTreeNode
    {
        #region Constructors

        public ElementNode(XmlElement element)
        {
            this.Name = element.Name;
            this.Text = "<" + this.Name + ">";
            foreach (XmlAttribute at in element.Attributes)
            {
                this.Nodes.Add(new AttributeNode(at));
            }
            foreach (XmlNode n in element.ChildNodes)
            {
                // ----------------------------------------------------------------------------------
                // Content parsing.
                if (n is XmlElement)
                    this.Nodes.Add(new ElementNode((XmlElement) n));
                else
                {
                    // If we are have the object "content".
                    if (n.NodeType == XmlNodeType.Text)
                        this.Nodes.Add("#text", n.InnerText);
                // ----------------------------------------------------------------------------------
                }
            }
        }

        #endregion
...


Это сообщение отредактировал(а) valzy - 25.11.2008, 11:52
PM MAIL   Вверх
diadiavova
Дата 25.11.2008, 12:53 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Обрати внимание на то, что некоторые коды я в своём примере не использовал вообще(хотя сам же и написал их). Например: создал абстрактный класс для всех узлов, в нём есть свойство, показывающее тип узла, которое я ни разу не использовал. Всё это делалось для того, чтобы модель можно было расширить при необходимости. Если тебе нужно включить в модель текстовый блок, блок CDATA, инструкцию приложения, или к примеру элемент, который должен вести себя по-другому - всё это можно организовать путём наследования от абстрактного класса XmlTreeNode.
Естественно: Некоторых изменений это потребует и в существующих классах, но они незначительны.

Вот так примерно должен выглядеть текстовый узел
Код

    public class TextNode : XmlTreeNode
    {
      
        public TextNode(XmlText node)
        {
            this.Text = node.Name;
            this.TextValue = node.Value;
        }

        public override XmlNodeType XmlNodeType
        {
            get 
            {
                return XmlNodeType.Text;
            }
        }

        public override XmlNode GetXmlNode(XmlDocument dock)
        {
            return (XmlNode)GetXmlTex(dock);
        }

        public XmlText GetXmlTex(XmlDocument dock)
        {
            return dock.CreateTextNode(this.TextValue);
        }

        string _textValue = string.Empty;
        public string TextValue
        {
            get
            {
                return _textValue;
            }
            set
            {
                _textValue = value;
            }
        }


Естественно, что он будет отображать - решать тебе, в таком виде в дереве просто будет написано #text, нужно что-то другое - пропиши это в конструкторе.


Кроме того, в конструкторе ElementNode надо указать, что если узел документа является текстовым, то надо формировать соответствующий элемент.

Код

  public ElementNode(XmlElement element)
        {
            this.Name = element.Name;
            this.Text = "<" + this.Name + ">";
            foreach(XmlAttribute at in element.Attributes)
            {
                this.Nodes.Add(new AttributeNode((XmlAttribute)at));
            }
            foreach (XmlNode n in element.ChildNodes)
            {
          XmlTreeNode newNode=null;
                switch(n.NodeType)
                {
                    case XmlNodeType.Element:
                newNode=new ElementNode((XmlElement)n);
                break;
                    case XmlNodeType.Text:
                newNode = new TextNode((XmlText)n);
                break;
                
                }
                try
                {
                    this.Nodes.Add(newNode);
                }
                catch 
                {
                
                }

            }
        }

Примерно так. Код не проверял, но если идея ясна, то возможные ошибки исправишь сам.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
valzy
Дата 26.11.2008, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile

Это сообщение отредактировал(а) valzy - 27.11.2008, 08:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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