private void treeView_AcceptingDraggedNode(object source, AcceptingDraggedNodeEventArgs e) { /* * This example enforces the following: * - Folders should only exist at the top level * - Leaves can exist at the top level or inside a folder * * Determining whether a node is a leaf or a folder is based on ImageIndex. * 0 = folder, 1 = leaf. In a real application, this mechanism would probably * be replaced with something a litle better (using the Tag property of each * node, for example). */ // Don't allow a folder to become buried if (e.NodeMoving.ImageIndex == 0 && e.NodeOver.Level > 0) { e.PreventAnyDrop = true; } // Don't allow folders to be dropped as childen under anything if (e.NodeMoving.ImageIndex == 0) { e.PreventDropAsChild = true; } // Don't allow dropping under non-zero items (non-folders) if (e.NodeOver.ImageIndex > 0) { e.PreventDropAsChild = true; } }
private void DragDropTreeView_DragOver(object sender, DragEventArgs e) { var clientPos = PointToClient(Cursor.Position); // Scroll the tree up/down if necessary if (AutoScrollEnabled) { AutoScroll(clientPos); } var nodeOver = GetNodeAt(clientPos); var nodeMoving = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); // nodeOver must not be null, and nodeOver must not be the same as nodeMoving UNLESS // nodeOver is the last node in the branch (so it is possible to drop below a parent branch) if (nodeOver != null && (nodeOver != nodeMoving || (nodeOver.Parent != null && nodeOver.Index == (nodeOver.Parent.Nodes.Count - 1)))) { var offsetY = PointToClient(Cursor.Position).Y - nodeOver.Bounds.Top; // Prevent paradoxes here and now if (CausesParadox(nodeOver, nodeMoving)) { SetPlaceholders(PlaceholderLocation.None, null, null); return; } // Create a new event args object for the AcceptingDraggedNode event. var args = new AcceptingDraggedNodeEventArgs(nodeOver, nodeMoving); // Fire the event (if there is a handler attached) if (AcceptingDraggedNode != null) { AcceptingDraggedNode(this, args); } if (args.PreventAnyDrop) { SetPlaceholders(PlaceholderLocation.None, null, null); e.Effect = DragDropEffects.None; return; } e.Effect = DragDropEffects.Move; if (args.PreventDropAsChild) { // Node does not accept children (is a leaf) // Collapse so we don't get weirdness when dropping below the node // but apparently above its children nodes. if (nodeOver.IsExpanded) { nodeOver.Collapse(true); } HandleDraggingOverNonChildAcceptingNode(offsetY, nodeOver); } else { // Node accepts children HandleDraggingOverChildAcceptingNode(offsetY, nodeOver, nodeMoving); } } }