// // Timer tick. Updates scrolling of the TreeView // private void timer_Tick(object sender, EventArgs e) { // get node at mouse position Point pt = PointToClient(MousePosition); TreeNode node = GetNodeAt(pt); if (node == null) { return; } // if mouse is near to the top, scroll up if (pt.Y < 30) { // set actual node to the upper one if (node.PrevVisibleNode != null) { node = node.PrevVisibleNode; // hide drag image DragHelper.ImageList_DragShowNolock(false); // scroll and refresh node.EnsureVisible(); Refresh(); // show drag image DragHelper.ImageList_DragShowNolock(true); } } // if mouse is near to the bottom, scroll down else if (pt.Y > Size.Height - 30) { if (node.NextVisibleNode != null) { node = node.NextVisibleNode; DragHelper.ImageList_DragShowNolock(false); node.EnsureVisible(); Refresh(); DragHelper.ImageList_DragShowNolock(true); } } }
// // OnDragOver event handler. Updates the dragged node's ghost image's position // protected override void OnDragOver(DragEventArgs drgevent) { base.OnDragOver(drgevent); // Cancel if no node is being dragged if (_draggedNode == null) { return; } // Compute drag position and move image var findForm = FindForm(); if (findForm != null) { Point formP = findForm.PointToClient(new Point(drgevent.X, drgevent.Y)); DragHelper.ImageList_DragMove(formP.X - Left, formP.Y - Top); } // Get actual drop node TreeNode dropNode = GetNodeAt(PointToClient(new Point(drgevent.X, drgevent.Y))); if (dropNode == null) { drgevent.Effect = DragDropEffects.None; return; } TreeViewNodeDragEventArgs evArgs = new TreeViewNodeDragEventArgs(TreeViewNodeDragEventType.DragOver, TreeViewNodeDragEventBehavior.PlaceInside, _draggedNode, dropNode); if (DragOperation != null) { DragOperation(evArgs); // Cancel the operation if the user specified so if (evArgs.Cancel) { drgevent.Effect = DragDropEffects.None; OnDragDrop(drgevent); return; } if (!evArgs.Allow) { return; } } drgevent.Effect = DragDropEffects.Move; // Dissalow the drag here if (!evArgs.Allow) { drgevent.Effect = DragDropEffects.None; } // if mouse is on a new node select it if (_tempDropNode != dropNode) { DragHelper.ImageList_DragShowNolock(false); SelectedNode = dropNode; DragHelper.ImageList_DragShowNolock(true); _tempDropNode = dropNode; } // Avoid that drop node is child of drag node TreeNode tmpNode = dropNode; while (tmpNode.Parent != null) { if (tmpNode.Parent == _draggedNode) { drgevent.Effect = DragDropEffects.None; } tmpNode = tmpNode.Parent; } }