Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Копирование из одного treeview в другой (http://forum.oszone.net/showthread.php?t=349582)

blackeangel 09-09-2021 20:40 2966290

Копирование из одного treeview в другой
 
Есть 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



Время: 10:10.

Время: 10:10.
© OSzone.net 2001-