ドラッグ アンド ドロップによるマウス動作の概要 (Windows フォーム .NET)

Windows フォームには、ドラッグ アンド ドロップの動作を実装する一連のメソッド、イベント、およびクラスが含まれています。 このトピックでは、Windows フォームでのドラッグ アンド ドロップのサポートの概要について説明します。

重要

.NET 7 と .NET 6 用のデスクトップ ガイド ドキュメントは作成中です。

ドラッグ アンド ドロップのイベント

ドラッグ アンド ドロップ操作のイベントには、ドラッグ アンド ドロップ操作の現在のターゲットで発生するイベントと、ドラッグ アンド ドロップ操作のソースで発生するイベントの 2 つのカテゴリがあります。 ドラッグ アンド ドロップ操作を実行するには、これらのイベントを処理する必要があります。 これらのイベントのイベント引数で使用できる情報を操作することにより、ドラッグ アンド ドロップ操作を簡単に容易にすることができます。

現在のドロップ ターゲットのイベント

次の表は、ドラッグ アンド ドロップ操作の現在のターゲットで発生するイベントを示します。

マウス イベント 説明
DragEnter このイベントは、オブジェクトがコントロールの境界内にドラッグされると発生します。 このイベントのハンドラーは、型 DragEventArgs の引数を受け取ります。
DragOver このイベントは、マウス ポインターがコントロールの境界内にある間にオブジェクトがドラッグされるときに発生します。 このイベントのハンドラーは、型 DragEventArgs の引数を受け取ります。
DragDrop このイベントは、ドラッグ アンド ドロップ操作が完了したときに発生します。 このイベントのハンドラーは、型 DragEventArgs の引数を受け取ります。
DragLeave このイベントは、オブジェクトがコントロールの境界外にドラッグされたときに発生します。 このイベントのハンドラーは、型 EventArgs の引数を受け取ります。

DragEventArgs クラスは、マウスのポインターの場所、マウス ボタンとキーボードの修飾子キーの現在の状態、ドラッグされているデータ、およびドラッグ イベントのソースによって許可される操作と操作に対するターゲットのドロップの効果を指定する DragDropEffects の値を提供します。

ドロップ ソースのイベント

次の表は、ドラッグ アンド ドロップ操作のソースで発生するイベントを示します。

マウス イベント 説明
GiveFeedback このイベントは、ドラッグ操作中に発生します。 マウス ポインターを変更するなど、ドラッグ アンド ドロップ操作が実行されていることを示す視覚上の手掛かりをユーザーに示す機会を提供します。 このイベントのハンドラーは、型 GiveFeedbackEventArgs の引数を受け取ります。
QueryContinueDrag このイベントは、ドラッグ アンド ドロップ操作中に発生し、ドラッグ ソースがドラッグ アンド ドロップ操作をキャンセルする必要があるかどうかを決定できるようにします。 このイベントのハンドラーは、型 QueryContinueDragEventArgs の引数を受け取ります。

QueryContinueDragEventArgs クラスは、マウス ボタンとキーボードの修飾子キーの現在の状態、ESC キーを押したかどうかを指定する値、およびドラッグ アンド ドロップ操作を続行するかどうかを指定するために設定できる DragAction の値を提供します。

ドラッグ アンド ドロップの実行

ドラッグ アンド ドロップ操作には、ドラッグ ソースドロップ ターゲットという 2 つのコンポーネントが常に含まれています。 ドラッグ アンド ドロップ操作を開始するには、コントロールをソースとして指定し、MouseDown イベントを処理します。 イベント ハンドラーで、ドロップに関連付けられたデータと DragDropEffects 値を指定して DoDragDrop メソッドを呼び出します。

ターゲット コントロールの AllowDrop プロパティを true に設定して、そのコントロールでドラッグ アンド ドロップ操作を受け入れることができるようにします。 ターゲットによって 2 つのイベントが処理されます。1 つ目は、DragOver など、コントロールに対して行われているドラッグに応答するイベントです。 また、2 つ目は、ドロップ アクション自体のイベントです (DragDrop)。

次の例は、Label コントロールから TextBox へのドラッグを示しています。 ドラッグが完了すると、TextBox は、ラベルのテキストを自身に割り当てることで応答します。

// Initiate the drag
private void label1_MouseDown(object sender, MouseEventArgs e) =>
    DoDragDrop(((Label)sender).Text, DragDropEffects.All);

// Set the effect filter and allow the drop on this control
private void textBox1_DragOver(object sender, DragEventArgs e) =>
    e.Effect = DragDropEffects.All;

// React to the drop on this control
private void textBox1_DragDrop(object sender, DragEventArgs e) =>
    textBox1.Text = (string)e.Data.GetData(typeof(string));
' Initiate the drag
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs)
    DoDragDrop(DirectCast(sender, Label).Text, DragDropEffects.All)
End Sub

' Set the effect filter and allow the drop on this control
Private Sub TextBox1_DragOver(sender As Object, e As DragEventArgs)
    e.Effect = DragDropEffects.All
End Sub

' React to the drop on this control
Private Sub TextBox1_DragDrop(sender As Object, e As DragEventArgs)
    TextBox1.Text = e.Data.GetData(GetType(String))
End Sub

ドラッグの効果の詳細については、DataAllowedEffect に関する記事を参照してください。

関連項目