TreeView.ItemDrag 事件

当用户开始拖动节点时发生。

**命名空间:**System.Windows.Forms
**程序集:**System.Windows.Forms(在 system.windows.forms.dll 中)

语法

声明
Public Event ItemDrag As ItemDragEventHandler
用法
Dim instance As TreeView
Dim handler As ItemDragEventHandler

AddHandler instance.ItemDrag, handler
public event ItemDragEventHandler ItemDrag
public:
event ItemDragEventHandler^ ItemDrag {
    void add (ItemDragEventHandler^ value);
    void remove (ItemDragEventHandler^ value);
}
/** @event */
public void add_ItemDrag (ItemDragEventHandler value)

/** @event */
public void remove_ItemDrag (ItemDragEventHandler value)
JScript 支持使用事件,但不支持进行新的声明。

备注

有关处理事件的更多信息,请参见 使用事件

示例

下面的代码示例演示如何在 TreeView 控件中启用拖放操作。在该示例中,可以将任何节点拖动到另一个不是被拖动节点的子代的节点。被拖动的节点(包括其所有子代节点)成为目标节点的子级。当使用鼠标左键时,被拖动的节点移动到目标节点。当使用鼠标右键时,被拖动的节点复制到目标节点。

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

Public Class Form1
    Inherits Form
    Private treeView1 As TreeView

    Public Sub New()
        treeView1 = New TreeView()
        
        Me.SuspendLayout()
        
        ' 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)
        Me.Controls.Add(treeView1)

        Me.ResumeLayout(False)
    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
                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.
            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.
            targetNode.Expand()
        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 
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);
    }

}
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>

using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
public ref class Form1: public Form
{
private:
   TreeView^ treeView1;

public:
   Form1()
   {
      treeView1 = gcnew 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 += gcnew ItemDragEventHandler( this, &Form1::treeView1_ItemDrag );
      treeView1->DragEnter += gcnew DragEventHandler( this, &Form1::treeView1_DragEnter );
      treeView1->DragOver += gcnew DragEventHandler( this, &Form1::treeView1_DragOver );
      treeView1->DragDrop += gcnew DragEventHandler( this, &Form1::treeView1_DragDrop );
      
      // Initialize the form.
      this->ClientSize = System::Drawing::Size( 292, 273 );
      this->Controls->Add( treeView1 );
      this->ResumeLayout( false );
   }

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
      
      // Copy the dragged node when the right mouse button is used.
      if ( e->Button == ::MouseButtons::Right )
      {
         DoDragDrop( e->Item, DragDropEffects::Copy );
      }
   }

   // Set the target drop effect to the effect 
   // specified in the ItemDrag event handler.
   void treeView1_DragEnter( Object^ /*sender*/, DragEventArgs^ e )
   {
      e->Effect = e->AllowedEffect;
   }

   // Select the node under the mouse pointer to indicate the 
   // expected drop location.
   void treeView1_DragOver( Object^ /*sender*/, DragEventArgs^ e )
   {
      // Retrieve the client coordinates of the mouse position.
      Point targetPoint = treeView1->PointToClient( Point(e->X,e->Y) );
      
      // Select the node at the mouse position.
      treeView1->SelectedNode = treeView1->GetNodeAt( targetPoint );
   }

   void treeView1_DragDrop( Object^ /*sender*/, DragEventArgs^ e )
   {
      // Retrieve the client coordinates of the drop location.
      Point targetPoint = treeView1->PointToClient( 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 = dynamic_cast<TreeNode^>(e->Data->GetData( TreeNode::typeid ));
      
      // 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 it is a copy operation, clone the dragged node 
         // and add it to the node at the drop location.
         if ( e->Effect == DragDropEffects::Copy )
         {
            targetNode->Nodes->Add( dynamic_cast<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.
   bool ContainsNode( TreeNode^ node1, TreeNode^ node2 )
   {
      // Check the parent node of the second node.
      if ( node2->Parent == nullptr )
            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 );
   }
};

[STAThread]
int main()
{
   Application::Run( gcnew Form1 );
}
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

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

请参见

参考

TreeView 类
TreeView 成员
System.Windows.Forms 命名空间
OnItemDrag