Windows フォームには、ドラッグ アンド ドロップ動作を実装する一連のメソッド、イベント、およびクラスが含まれています。 この記事では、Windows フォームでのドラッグ アンド ドロップのサポートの概要について説明します。
ドラッグ アンド ドロップ イベント
ドラッグ アンド ドロップ操作には、ドラッグ アンド ドロップ操作の現在のターゲットで発生するイベントと、ドラッグ アンド ドロップ操作のソースで発生するイベントの 2 つのカテゴリがあります。 ドラッグ アンド ドロップ操作を実行するには、これらのイベントを処理する必要があります。 これらのイベントのイベント引数で使用できる情報を操作することで、ドラッグ アンド ドロップ操作を簡単に行うことができます。
現在のドロップ ターゲットのイベント
次の表は、ドラッグ アンド ドロップ操作の現在のターゲットで発生するイベントを示しています。
マウス イベント | 説明 |
---|---|
DragEnter | このイベントは、オブジェクトがコントロールの境界にドラッグされたときに発生します。 このイベントのハンドラーは、DragEventArgs型の引数を受け取ります。 |
DragOver | このイベントは、マウス ポインターがコントロールの境界内にある間にオブジェクトがドラッグされたときに発生します。 このイベントのハンドラーは、DragEventArgs型の引数を受け取ります。 |
DragDrop | このイベントは、ドラッグ アンド ドロップ操作が完了したときに発生します。 このイベントのハンドラーは、DragEventArgs型の引数を受け取ります。 |
DragLeave | このイベントは、オブジェクトがコントロールの境界からドラッグされたときに発生します。 このイベントのハンドラーは、EventArgs型の引数を受け取ります。 |
DragEventArgs クラスは、マウス ポインターの場所、マウス ボタンとキーボードの修飾キーの現在の状態、ドラッグされるデータ、およびドラッグ イベントのソースによって許可される操作と操作のターゲット ドロップ効果を指定する DragDropEffects 値を提供します。
ドロップ元のイベント
次の表に、ドラッグ アンド ドロップ操作のソースで発生するイベントを示します。
マウス イベント | 説明 |
---|---|
GiveFeedback | このイベントは、ドラッグ操作中に発生します。 マウス ポインターの変更など、ドラッグ アンド ドロップ操作が発生していることを視覚的にユーザーに示す機会を提供します。 このイベントのハンドラーは、GiveFeedbackEventArgs型の引数を受け取ります。 |
QueryContinueDrag | このイベントは、ドラッグ アンド ドロップ操作中に発生し、ドラッグ ソースがドラッグ アンド ドロップ操作を取り消す必要があるかどうかを判断できるようにします。 このイベントのハンドラーは、QueryContinueDragEventArgs型の引数を受け取ります。 |
QueryContinueDragEventArgs クラスは、マウス ボタンとキーボードの修飾キーの現在の状態、ESC キーが押されたかどうかを指定する値、およびドラッグ アンド ドロップ操作を続行するかどうかを指定するために設定できる DragAction 値を提供します。
ドラッグ アンド ドロップの実行
ドラッグ アンド ドロップ操作には、常に 2 つのコンポーネントが含まれます。ドラッグ ソース と ドロップ ターゲット。 ドラッグ アンド ドロップ操作を開始するには、コントロールをソースとして指定し、MouseDown イベントを処理します。 イベント ハンドラーで、ドロップに関連付けられたデータとDoDragDrop値を提供するDragDropEffects メソッドを呼び出します。
ターゲット コントロールの AllowDrop プロパティを true
に設定して、そのコントロールがドラッグ アンド ドロップ操作を受け入れるようにします。 ターゲットは 2 つのイベントを処理します。最初に、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
ドラッグ効果の詳細については、「Data と AllowedEffect」を参照してください。
こちらも参照ください
.NET Desktop feedback