ItemDragEventHandler 委托

定义

表示将处理 ListView 控件或 TreeView 控件的 ItemDrag 事件的方法。

public delegate void ItemDragEventHandler(System::Object ^ sender, ItemDragEventArgs ^ e);
public delegate void ItemDragEventHandler(object sender, ItemDragEventArgs e);
public delegate void ItemDragEventHandler(object? sender, ItemDragEventArgs e);
type ItemDragEventHandler = delegate of obj * ItemDragEventArgs -> unit
Public Delegate Sub ItemDragEventHandler(sender As Object, e As ItemDragEventArgs)

参数

sender
Object

事件源。

e
ItemDragEventArgs

包含事件数据的 ItemDragEventArgs

示例

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

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

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

    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

    ' 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

    ' 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

    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

    ' 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

注解

创建 ItemDragEventHandler 委托时,需要标识将要处理该事件的方法。 若要将事件与事件处理程序关联,请将该委托的一个实例添加到事件中。 除非移除了该委托,否则每当发生该事件时就会调用事件处理程序。 有关事件处理程序委托的详细信息,请参阅 处理和引发事件

扩展方法

GetMethodInfo(Delegate)

获取指示指定委托表示的方法的对象。

适用于

另请参阅