TreeView.ItemDrag イベント
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ユーザーがノードのドラッグを開始すると発生します。
public:
event System::Windows::Forms::ItemDragEventHandler ^ ItemDrag;
public event System.Windows.Forms.ItemDragEventHandler ItemDrag;
public event System.Windows.Forms.ItemDragEventHandler? ItemDrag;
member this.ItemDrag : System.Windows.Forms.ItemDragEventHandler
Public Custom Event ItemDrag As ItemDragEventHandler
イベントの種類
例
次のコード例では、コントロール内でドラッグ アンド ドロップ操作を有効にする方法を 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
注釈
イベントの処理の詳細については、「処理とイベントの発生」を参照してください。
適用対象
こちらもご覧ください
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET