Есть 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