This documentation is archived and is not being maintained.

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 Sub ItemDragEventHandler ( _
	sender As Object, _
	e As ItemDragEventArgs _


Type: System.Object
The source of the event.
Type: System.Windows.Forms.ItemDragEventArgs
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.

Imports System
Imports System.Drawing
Imports System.Windows.Forms

Public Class Form1
    Inherits Form
    Private treeView1 As TreeView

    Public Sub New()
        treeView1 = New TreeView()


        ' Initialize treeView1.
        treeView1.AllowDrop = True
        treeView1.Dock = DockStyle.Fill

        ' Add nodes to treeView1.
        Dim node As TreeNode
        Dim x As Integer
        For x = 0 To 3
            ' Add a root node to treeView1.
            node = treeView1.Nodes.Add(String.Format("Node{0}", x * 4))
            Dim y As Integer
            For y = 1 To 4
                ' Add a child node to the previously added node.
                node = node.Nodes.Add(String.Format("Node{0}", x * 4 + y))
            Next y
        Next x

        ' Add event handlers for the required drag events.
        AddHandler treeView1.ItemDrag, AddressOf treeView1_ItemDrag
        AddHandler treeView1.DragEnter, AddressOf treeView1_DragEnter
        AddHandler treeView1.DragOver, AddressOf treeView1_DragOver
        AddHandler treeView1.DragDrop, AddressOf treeView1_DragDrop

        ' Initialize the form.
        Me.ClientSize = New Size(292, 273)

    End Sub 'New

    Shared Sub Main()
        Application.Run(New Form1)
    End Sub 'Main

    Private Sub treeView1_ItemDrag(ByVal sender As Object, ByVal e As ItemDragEventArgs)

        ' Move the dragged node when the left mouse button is used.
        If e.Button = MouseButtons.Left Then
            DoDragDrop(e.Item, DragDropEffects.Move)

        ' Copy the dragged node when the right mouse button is used.
        ElseIf e.Button = MouseButtons.Right Then
            DoDragDrop(e.Item, DragDropEffects.Copy)
        End If
    End Sub 'treeView1_ItemDrag

    ' Set the target drop effect to the effect 
    ' specified in the ItemDrag event handler.
    Private Sub treeView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs)
        e.Effect = e.AllowedEffect
    End Sub 'treeView1_DragEnter

    ' Select the node under the mouse pointer to indicate the 
    ' expected drop location.
    Private Sub treeView1_DragOver(ByVal sender As Object, ByVal e As DragEventArgs)
        ' Retrieve the client coordinates of the mouse position.
        Dim targetPoint As Point = treeView1.PointToClient(new Point(e.X, e.Y))

        ' Select the node at the mouse position.
        treeView1.SelectedNode = treeView1.GetNodeAt(targetPoint)
    End Sub 'treeView1_DragOver

    Private Sub treeView1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)

        ' Retrieve the client coordinates of the drop location.
        Dim targetPoint As Point = treeView1.PointToClient(New Point(e.X, e.Y))

        ' Retrieve the node at the drop location.
        Dim targetNode As TreeNode = treeView1.GetNodeAt(targetPoint)

        ' Retrieve the node that was dragged.
        Dim draggedNode As TreeNode = CType(e.Data.GetData(GetType(TreeNode)), TreeNode)

        ' Confirm that the node at the drop location is not 
        ' the dragged node or a descendant of the dragged node.
        If Not draggedNode.Equals(targetNode) AndAlso Not ContainsNode(draggedNode, targetNode) Then

            ' 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 Then

            ' If it is a copy operation, clone the dragged node 
            ' and add it to the node at the drop location.
            ElseIf e.Effect = DragDropEffects.Copy Then
                targetNode.Nodes.Add(CType(draggedNode.Clone(), TreeNode))
            End If

            ' Expand the node at the location 
            ' to show the dropped node.
        End If
    End Sub 'treeView1_DragDrop

    ' Determine whether one node is a parent 
    ' or ancestor of a second node.
    Private Function ContainsNode(ByVal node1 As TreeNode, ByVal node2 As TreeNode) As Boolean

        ' Check the parent node of the second node.
        If node2.Parent Is Nothing Then
            Return False
        End If
        If node2.Parent.Equals(node1) Then
            Return True
        End If

        ' 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)
    End Function 'ContainsNode

End Class 'Form1 

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

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