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

Откуда:
Сообщений: 572
Есть 2 treeview: 1й - основной, 2й - втростепенный, из 2го в 1й перекидываем через drag&drop элементы дерева(как узды, так и дочерние). Так вот, у меня происходит перемещение элементов дерева, а не их копирование.
Как сделать чтобы копировались?
Как сделать, что б можно было перемещать дочерние элементы из одного узла в любой другой в любую позицию другого узла?
Как сделать, что бы можно было засунуть назад вытащеный за пределы узла дочерний элемент?
//Treeview 1
            this.ETPTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
            this.ETPTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
            this.ETPTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
            this.ETPTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView_DragOver);
            this.ETPTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.ETPTreeView_AfterCheck);
            this.ETPTreeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.ETPTreeView_AfterCollapse);
            this.ETPTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.ETPTreeView_AfterLabelEdit);
            this.ETPTreeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.ETPTreeView_NodeMouseClick);
            this.ETPTreeView.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.ETPTreeView_AfterExpand);
            this.ETPTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseDown);
            //treeview 2
            this.DonorETPTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
            this.DonorETPTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseDown);
            //
        #region treeView
        private void treeView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (Control.ModifierKeys == Keys.Control && e.Button == MouseButtons.Left) 
            {
                ((TreeView)sender).CheckBoxes = true;
            }
        }
        private void treeView_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
        {
            DoDragDrop(e.Item, DragDropEffects.All);
        }
        private void treeView_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }
        private void treeView_DragOver(object sender, DragEventArgs e)
        {
            Point targetPoint = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
            ((TreeView)sender).SelectedNode = ((TreeView)sender).GetNodeAt(targetPoint);
        }
        private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
            TreeNodeCollection Nodes;
            TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
            if (DestinationNode == null) Nodes = ((TreeView)sender).Nodes;
            else Nodes = DestinationNode.Nodes;
            if (e.Data.GetDataPresent(typeof(DataGridViewSelectedRowCollection)))
            {
                //string columnName = DataGridView
                foreach (DataGridViewRow dr in (DataGridViewSelectedRowCollection)e.Data.GetData(typeof(DataGridViewSelectedRowCollection)))
                {
                    Nodes.Add(dr.Cells["Материалы"].Value.ToString());
                }
            }
            else if (e.Data.GetDataPresent(typeof(TreeNode)))
            {
                TreeNode NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
                if (DestinationNode == null)
                {
                    TreeNode tempNode = (TreeNode)NewNode.Clone();
                    NewNode.Remove();
                    ((TreeView)sender).Nodes.Add(tempNode);
                }
                else
                {
                    if (DestinationNode.Level < NewNode.Level)
                    {
                        DestinationNode.Nodes.Add((TreeNode)NewNode.Clone());
                        DestinationNode.Expand();
                        NewNode.Remove();
                    }
                    else
                    {
                        // меняем местами
                        if (DestinationNode.Level == NewNode.Level)
                        {
                            TreeNode parent = NewNode.Parent;
                            TreeNode tempNode = (TreeNode)NewNode.Clone();
                            if (parent != null)
                            {
                                parent.Nodes.RemoveAt(NewNode.Index);
                                if (NewNode.Index > DestinationNode.Index) parent.Nodes.Insert(DestinationNode.Index, tempNode);
                                else parent.Nodes.Insert(DestinationNode.Index + 1, tempNode);
                            }
                            else
                            {
                                ((TreeView)sender).Nodes.RemoveAt(NewNode.Index);
                                if (NewNode.Index > DestinationNode.Index) ((TreeView)sender).Nodes.Insert(DestinationNode.Index, tempNode);
                                else ((TreeView)sender).Nodes.Insert(DestinationNode.Index + 1, tempNode);
                            }
                        }
                    }
                }
            }
        }
        #endregion
9 сен 21, 20:42    [22370139]     Ответить | Цитировать Сообщить модератору
 Re: Копирование из одного treeview в другой  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4283
TreeView это элемент управления, который отображает данные. Не нужно ничего копировать из него в кого то еще.
Копирование данных должно происходить в слое представления данных и слое данных, или других низкоуровневых слоях, в зависимости от того какой "шаблон" вы используйте.
А в слое представления (в интерфейсе), нужно просто обновить элементы управления к актуальному состоянию, после такого копирования.
19 сен 21, 16:11    [22373361]     Ответить | Цитировать Сообщить модератору
 Re: Копирование из одного treeview в другой  [new]
BlackeAngel
Member

Откуда:
Сообщений: 572
Roman Mejtes,

Но, на секунду, взаимодействие идёт с интерфейсом сначало, а потом уже обработка этих действий нижними слоями. Следовательно, необходимо делать сначала визуализацию, а затем уже обрабатывать, то что натворили
30 сен 21, 20:34    [22378097]     Ответить | Цитировать Сообщить модератору
 Re: Копирование из одного treeview в другой  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4450
BlackeAngel
Roman Mejtes,

Но, на секунду, взаимодействие идёт с интерфейсом сначало, а потом уже обработка этих действий нижними слоями. Следовательно, необходимо делать сначала визуализацию, а затем уже обрабатывать, то что натворили


Это только юзеру может казаться, что сначало так, но выше Roman Mejtes уже по-моему доступно объяснил
1 окт 21, 10:28    [22378288]     Ответить | Цитировать Сообщить модератору
 Re: Копирование из одного treeview в другой  [new]
Eolt
Member

Откуда:
Сообщений: 1867
BlackeAngel
Roman Mejtes,

Но, на секунду, взаимодействие идёт с интерфейсом сначало, а потом уже обработка этих действий нижними слоями. Следовательно, необходимо делать сначала визуализацию, а затем уже обрабатывать, то что натворили


Ты все правильно говоришь, товарищи там совсем не в теме.
Посмотри тут
Сам недавно делал перетаскивание и копирование узлов. Но не на шарпах к сожалению.

К сообщению приложен файл. Размер - 134Kb
4 окт 21, 02:10    [22378974]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить