Beispiel #1
0
        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);
                }
            }
        }