Export (0) Print
Expand All
Expand Minimize

ItemDragEventHandler Delegate

Represents the method that will handle the ItemDrag event of a ListView or TreeView control.

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in system.windows.forms.dll)

public delegate void ItemDragEventHandler (
	Object sender,
	ItemDragEventArgs e
)
/** @delegate */
public delegate void ItemDragEventHandler (
	Object sender, 
	ItemDragEventArgs e
)
JScript supports the use of delegates, but not the declaration of new ones.

Parameters

sender

The source of the event.

e

An ItemDragEventArgs that contains the event data.

When you create an ItemDragEventHandler delegate, you identify the method that will handle the event. To associate the event with your event handler, add an instance of the delegate to the event. The event handler is called whenever the event occurs, unless you remove the delegate. For more information about event handler delegates, see Events and Delegates.

The following example demonstrates how to enable drag-and-drop operations within a TreeView control. In the example, any node can be dragged to another node that is not a descendant of the dragged node. The dragged node, including all of its descendant nodes, becomes a child of the destination node. When the left mouse button is used, the dragged node is moved to the destination node. When the right mouse button is used, the dragged node is copied to the destination node.

using System;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : Form
{
    private TreeView treeView1;

    public Form1()
    {
        treeView1 = new TreeView();

        this.SuspendLayout();

        // Initialize treeView1.
        treeView1.AllowDrop = true;
        treeView1.Dock = DockStyle.Fill;

        // Add nodes to treeView1.
        TreeNode node;
        for (int x = 0; x < 3; ++x)
        {
            // Add a root node to treeView1.
            node = treeView1.Nodes.Add(String.Format("Node{0}", x*4));
            for (int y = 1; y < 4; ++y)
            {
                // Add a child node to the previously added node.
                node = node.Nodes.Add(String.Format("Node{0}", x*4 + y));
            }
        }

        // Add event handlers for the required drag events.
        treeView1.ItemDrag += new ItemDragEventHandler(treeView1_ItemDrag);
        treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter);
        treeView1.DragOver += new DragEventHandler(treeView1_DragOver);
        treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop);

        // Initialize the form.
        this.ClientSize = new Size(292, 273);
        this.Controls.Add(treeView1);

        this.ResumeLayout(false);
    }

    [STAThread]
    static void Main() 
    {
        Application.Run(new Form1());
    }

    private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
        // Move the dragged node when the left mouse button is used.
        if (e.Button == MouseButtons.Left)
        {
            DoDragDrop(e.Item, DragDropEffects.Move);
        }

        // Copy the dragged node when the right mouse button is used.
        else if (e.Button == MouseButtons.Right)
        {
            DoDragDrop(e.Item, DragDropEffects.Copy);
        }
    }

    // Set the target drop effect to the effect 
    // specified in the ItemDrag event handler.
    private void treeView1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = e.AllowedEffect;
    }

    // Select the node under the mouse pointer to indicate the 
    // expected drop location.
    private void treeView1_DragOver(object sender, DragEventArgs e)
    {
        // Retrieve the client coordinates of the mouse position.
        Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));

        // Select the node at the mouse position.
        treeView1.SelectedNode = treeView1.GetNodeAt(targetPoint);
    }

    private void treeView1_DragDrop(object sender, DragEventArgs e)
    {
        // Retrieve the client coordinates of the drop location.
        Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y));

        // Retrieve the node at the drop location.
        TreeNode targetNode = treeView1.GetNodeAt(targetPoint);

        // Retrieve the node that was dragged.
        TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode));

        // Confirm that the node at the drop location is not 
        // the dragged node or a descendant of the dragged node.
        if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode))
        {
            // If it is a move operation, remove the node from its current 
            // location and add it to the node at the drop location.
            if (e.Effect == DragDropEffects.Move)
            {
                draggedNode.Remove();
                targetNode.Nodes.Add(draggedNode);
            }

            // If it is a copy operation, clone the dragged node 
            // and add it to the node at the drop location.
            else if (e.Effect == DragDropEffects.Copy)
            {
                targetNode.Nodes.Add((TreeNode)draggedNode.Clone());
            }

            // Expand the node at the location 
            // to show the dropped node.
            targetNode.Expand();
        }
    }

    // Determine whether one node is a parent 
    // or ancestor of a second node.
    private bool ContainsNode(TreeNode node1, TreeNode node2)
    {
        // Check the parent node of the second node.
        if (node2.Parent == null) return false;
        if (node2.Parent.Equals(node1)) return true;

        // If the parent node is not null or equal to the first node, 
        // call the ContainsNode method recursively using the parent of 
        // the second node.
        return ContainsNode(node1, node2.Parent);
    }

}

import System.*;
import System.Drawing.*;
import System.Windows.Forms.*;

public class Form1 extends Form
{
    private TreeView treeView1;

    public Form1()
    {
        treeView1 = new TreeView();

        this.SuspendLayout();
        // Initialize treeView1.
        treeView1.set_AllowDrop(true);
        treeView1.set_Dock(DockStyle.Fill);
        // Add nodes to treeView1.
        TreeNode node;
        for (int x = 0; x < 3; ++x) {
            // Add a root node to treeView1.
            node = treeView1.get_Nodes().Add(String.
                Format("Node{0}", (Int32)(x * 4)));
            for (int y = 1; y < 4; ++y) {
                // Add a child node to the previously added node.
                node = node.get_Nodes().Add(String.
                    Format("Node{0}", (Int32)(x * 4 + y)));
            }
        }
        // Add event handlers for the required drag events.
        treeView1.add_ItemDrag(new ItemDragEventHandler(treeView1_ItemDrag));
        treeView1.add_DragEnter(new DragEventHandler(treeView1_DragEnter));
        treeView1.add_DragOver(new DragEventHandler(treeView1_DragOver));
        treeView1.add_DragDrop(new DragEventHandler(treeView1_DragDrop));
        // Initialize the form.
        this.set_ClientSize(new Size(292, 273));
        this.get_Controls().Add(treeView1);

        this.ResumeLayout(false);
    } //Form1

    /** @attribute STAThread()
     */
    public static void main(String[] args)
    {
        Application.Run(new Form1());
    } //main

    private void treeView1_ItemDrag(Object sender, ItemDragEventArgs e)
    {
        // Move the dragged node when the left mouse button is used.
        if (e.get_Button().Equals(get_MouseButtons().Left)) {
            DoDragDrop(e.get_Item(), DragDropEffects.Move);
        }
        // Copy the dragged node when the right mouse button is used.
        else {
            if (e.get_Button().Equals(get_MouseButtons().Right)) {
                DoDragDrop(e.get_Item(), DragDropEffects.Copy);
            }
        }
    } //treeView1_ItemDrag

    // Set the target drop effect to the effect 
    // specified in the ItemDrag event handler.
    private void treeView1_DragEnter(Object sender, DragEventArgs e)
    {
        e.set_Effect(e.get_AllowedEffect());
    } //treeView1_DragEnter

    // Select the node under the mouse pointer to indicate the 
    // expected drop location.
    private void treeView1_DragOver(Object sender, DragEventArgs e)
    {
        // Retrieve the client coordinates of the mouse position.
        Point targetPoint =
            treeView1.PointToClient(new Point(e.get_X(), e.get_Y()));
        // Select the node at the mouse position.
        treeView1.set_SelectedNode(treeView1.GetNodeAt(targetPoint));
    } //treeView1_DragOver

    private void treeView1_DragDrop(Object sender, DragEventArgs e)
    {
        // Retrieve the client coordinates of the drop location.
        Point targetPoint =
            treeView1.PointToClient(new Point(e.get_X(), e.get_Y()));
        // Retrieve the node at the drop location.
        TreeNode targetNode = treeView1.GetNodeAt(targetPoint);
        // Retrieve the node that was dragged.
        TreeNode draggedNode =
            (TreeNode)e.get_Data().GetData(TreeNode.class.ToType());
        // Confirm that the node at the drop location is not 
        // the dragged node or a descendant of the dragged node.
        if (!(draggedNode.Equals(targetNode))
            && !(ContainsNode(draggedNode, targetNode))) {
            // If it is a move operation, remove the node from its current 
            // location and add it to the node at the drop location.
            if (e.get_Effect().Equals(DragDropEffects.Move)) {
                draggedNode.Remove();
                targetNode.get_Nodes().Add(draggedNode);
            }
            // If it is a copy operation, clone the dragged node 
            // and add it to the node at the drop location.
            else {
                if (e.get_Effect().Equals(DragDropEffects.Copy)) {
                    targetNode.get_Nodes().Add((TreeNode)draggedNode.Clone());
                }
            }
            // Expand the node at the location 
            // to show the dropped node.
            targetNode.Expand();
        }
    } //treeView1_DragDrop

    // Determine whether one node is a parent 
    // or ancestor of a second node.
    private boolean ContainsNode(TreeNode node1, TreeNode node2)
    {
        // Check the parent node of the second node.
        if (node2.get_Parent() == null) {
            return false;
        }
        if (node2.get_Parent().Equals(node1)) {
            return true;
        }
        // If the parent node is not null or equal to the first node, 
        // call the ContainsNode method recursively using the parent of 
        // the second node.
        return ContainsNode(node1, node2.get_Parent());
    } //ContainsNode
} //Form1 

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

.NET Framework

Supported in: 2.0, 1.1, 1.0

Community Additions

ADD
Show:
© 2014 Microsoft