ItemDragEventHandler デリゲート
ListView コントロールまたは TreeView コントロールの ItemDrag イベントを処理するメソッドを表します。
<Serializable>
Public Delegate Sub ItemDragEventHandler( _ ByVal sender As Object, _ ByVal e As ItemDragEventArgs _)
[C#]
[Serializable]
public delegate void ItemDragEventHandler( object sender, ItemDragEventArgs e);
[C++]
[Serializable]
public __gc __delegate void ItemDragEventHandler( Object* sender, ItemDragEventArgs* e);
[JScript] JScript では、.NET Framework のデリゲートを利用することができます。ただし、独自に定義することはできません。
パラメータ [Visual Basic, C#, C++]
作成するイベント ハンドラは、ItemDragEventHandler クラスのデリゲート定義と同一のパラメータを持つ必要があります。
- sender
イベントのソース。 - e
イベント データを格納している ItemDragEventArgs 。
解説
ItemDragEventHandler デリゲートを作成する場合は、イベントを処理するメソッドを識別します。イベントをイベント ハンドラに関連付けるには、デリゲートのインスタンスをイベントに追加します。デリゲートを削除しない限り、そのイベントが発生すると常にイベント ハンドラが呼び出されます。イベント ハンドラ デリゲートの詳細については、「 イベントとデリゲート 」を参照してください。
使用例
[Visual Basic, C#, C++] 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
[C#]
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);
}
}
[C++]
#using <mscorlib.dll>
#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 __gc class Form1 : public 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(S"Node{0}", __box(x*4)));
for (int y = 1; y < 4; ++y)
{
// Add a child node to the previously added node.
node = node->Nodes->Add(String::Format(S"Node{0}", __box(x*4 + y)));
}
}
// Add event handlers for the required drag events.
treeView1->ItemDrag += new ItemDragEventHandler(this, &Form1::treeView1_ItemDrag);
treeView1->DragEnter += new DragEventHandler(this, &Form1::treeView1_DragEnter);
treeView1->DragOver += new DragEventHandler(this, &Form1::treeView1_DragOver);
treeView1->DragDrop += new 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 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(__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(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 == 0) 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(new Form1());
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Windows.Forms
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
アセンブリ: System.Windows.Forms (System.Windows.Forms.dll 内)