Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
Здравствуйте уважаемые Гуру!

В TreeView добавляются удаляются и редактируются узлы пользовательского класса
При клонировании узла не клонируются пользовательские свойства
хотя делаю приведение типа к пользовательскому классу
Подскажите пожалуйста где грабли?

Использую пользовательский класс узлов
class MyTreeNode : TreeNode
    {
        public int [b]NodeType[/b];

        public MyTreeNode()
        {}

Клонирование через "буфер" - _ndBuffer
MyTreeNode _ndBuffer = new MyTreeNode();
private void NodesCopy()
{
       MyTreeNode nd = (MyTreeNode) this.trvRules.SelectedNode; //Здесь пользовательские свойства передаются
       MyTreeNode nd =  this.trvRules.SelectedNode as MyTreeNode; //Такой вариант тоже работает
       this._ndBuffer = (MyTreeNode) nd.Clone();  //Здесь пользовательские свойства НЕ ПЕРЕДАЮТСЯ, только базовые
       this._ndBuffer = nd.Clone() as MyTreeNode;  //Так тоже не работает
}

_ndBuffer = 3;

private void NodesPaste()
{
        MyTreeNode nd = (MyTreeNode) this.trvRules.SelectedNode; //Здесь пользовательские свойства передаются
        this.trvRules.BeginUpdate();
        foreach (MyTreeNode node in _ndBuffer.Nodes)
        {
            nd.Nodes.Add((MyTreeNode)_ndBuffer.Clone());  //Здесь пользовательские свойства НЕ ПЕРЕДАЮТСЯ, только базовые
        } 
        this.trvRules.EndUpdate();
}


Заранее всем благодарен за помощь
21 сен 17, 17:53    [20813306]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
Arbit

_ndBuffer = 3;


Прошу прощение за ошибку
Должно быть
_ndBuffer.NodeType = 3;
21 сен 17, 17:56    [20813318]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
Неужели никто не может подсказать решение вопроса?
Или просто времени нет?

Я подожду
Заранее Спасибо
22 сен 17, 16:39    [20816849]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29749
Arbit
this._ndBuffer = (MyTreeNode) nd.Clone();  //Здесь пользовательские свойства НЕ ПЕРЕДАЮТСЯ, 

1. Зачем приведение класса если он и так такой?
2. Значит Clone () не работает.
22 сен 17, 16:50    [20816884]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 3997
Arbit, нужно переопределить public override object Clone()
Метод базового класса не знает о существовании производного и не может реализовать логику для клонирования его членов
22 сен 17, 16:51    [20816886]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
buser, Спасибо!
Наверное это то самое!

Вот только как это правильно сделать я пока не знаю. Все объять не успеваю :)
Буду благодарен за кусочек кода в качестве примера, если он небольшой,
или ссылку где можно почитать как это делается правильно

Спасибо
22 сен 17, 17:14    [20816961]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 3997
Arbit, типа того
class MyTreeNode : TreeNode
    {
        public int NodeType;
        .............
        public override object Clone()
       {
               var cpy = (MyTreeNode) base.Clone();
               cpy.NodeType = this.NodeType;
               return cpy;
        }
22 сен 17, 17:20    [20816983]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 3997
Arbit, вообще рекомендуют все говн расширения пихать в Tag
22 сен 17, 17:22    [20816989]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
buser, Спасибо большое!
дело в том, что у меня в Tag лежит другая информация.

Если пользовательские свойства - это говн расширения,
почему это прописано в MSDN?
Для какой цели тогда создаются пользовательские классы?
Не совсем понимаю, растолкуйте пожалуйста. Только по почкам не бейте пожалуйста :))
22 сен 17, 17:37    [20817028]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
buser
Arbit, типа того
class MyTreeNode : TreeNode
    {
        public int NodeType;
        .............
        public override object Clone()
       {
               var cpy = (MyTreeNode) base.Clone();
               cpy.NodeType = this.NodeType;
               return cpy;
        }

Спасибо большое за код!
Все работает
22 сен 17, 17:44    [20817042]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 3997
Arbit, да в целом все хорошо... это я "погорячился"
22 сен 17, 17:46    [20817046]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Arbit
Member

Откуда:
Сообщений: 190
buser, Хорошего дня!
22 сен 17, 17:54    [20817062]     Ответить | Цитировать Сообщить модератору
 Re: Клонирование TreeNode пользовательского класса в TreeView  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29749
Arbit
дело в том, что у меня в Tag лежит другая информация.

Как вариант, класс в tag сделать сколь необходимо большим. А дерево часто в ГУИ и лучше его не трогать. Будет унтверсальнее.
Но там сам смотри.
22 сен 17, 19:32    [20817188]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить