チュートリアル : Windows フォームにおけるドラッグ アンド ドロップ操作の実行
Windows ベースのアプリケーション内でドラッグ アンド ドロップ操作を実行するには、DragEnter、DragLeave、DragDrop などの一連のイベントを処理する必要があります。 これらのイベントのイベント引数で提供される情報を使用することにより、ドラッグ アンド ドロップ操作を簡単に実現できます。
データのドラッグ
すべてのドラッグ アンド ドロップ操作は、ドラッグから始まります。 ドラッグが開始されたときにデータを収集できるようにする機能は、DoDragDrop メソッドに実装されています。
次の例では、最も直観的な MouseDown イベントを使用してドラッグ操作を開始しています。これは、ほとんどのドラッグ アンド ドロップ操作は、マウス ボタンが押されることによって開始されるためです。 ただし、ドラッグ アンド ドロップの手順は任意のイベントを使用して開始できます。
ドラッグ操作を開始するには
ドラッグが開始されるコントロールの MouseDown イベントで、DoDragDrop メソッドを使用して、ドラッグされるデータおよびドラッグによって実行できる処理を設定します。 詳細については、「Data」および「AllowedEffect」を参照してください。
ドラッグ操作を開始する方法の例を次に示します。 ドラッグが開始されるコントロールは Button コントロール、ドラッグされるデータは、Button コントロールの Text プロパティを表す文字列、実行できる処理はコピーまたは移動のいずれかです。
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move) End Sub
private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { button1.DoDragDrop(button1.Text, DragDropEffects.Copy | DragDropEffects.Move); }
private void button1_MouseDown(Object sender, System.Windows.Forms.MouseEventArgs e) { button1.DoDragDrop(button1.get_Text(), DragDropEffects.Copy | DragDropEffects.Move); }
ドラッグ操作が行われている間、QueryContinueDrag イベントを処理できます。これは、ドラッグ操作を続けてよいかどうかシステムの "許可を得る" イベントです。 このメソッドを処理するときは、たとえば、カーソルが置かれたときに TreeView コントロールの TreeNode を展開するなど、ドラッグ操作に影響するメソッドを呼び出すのにも適しています。
データのドロップ
Windows フォームまたはコントロール上の場所からデータのドラッグを開始したら、それをどこかにドロップする必要があります。 データをドロップできるように正しく設定されているフォームまたはコントロールの領域をカーソルが横切ると、カーソルの形が変わります。 AllowDrop プロパティを設定し、DragEnter イベントと DragDrop イベントを処理することにより、Windows フォームまたはコントロール内の任意の領域で、ドロップされたデータを受け入れることができます。
ドロップを実行するには
AllowDrop プロパティを true に設定します。
ドロップ先のコントロールの DragEnter イベントで、ドラッグされるデータが適切な型 (この場合、Text) であることを確認します。 次に、コードでは、ドロップしたときの効果を DragDropEffects 列挙定数の値に設定します。 詳細については、「Effect」を参照してください。
Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter If (e.Data.GetDataPresent(DataFormats.Text)) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub
private void textBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; }
private void textBox1_DragEnter(Object sender, System.Windows.Forms.DragEventArgs e) { if (e.get_Data().GetDataPresent(DataFormats.Text)) e.set_Effect(DragDropEffects.Copy); else e.set_Effect(DragDropEffects.None); }
注意
SetData メソッドの Object パラメーターとして独自のオブジェクトを指定することで、固有の DataFormats を定義できます。 その場合は、指定するオブジェクトがシリアル化できるオブジェクトであることを確認してください。 詳細については、「ISerializable インターフェイス」を参照してください。
ドロップ先のコントロールの DragDrop イベントで、GetData メソッドを使用して、ドラッグされるデータを取得します。 詳細については、「DtaObject.Data プロパティ」を参照してください。
次の例では、データがドロップされるドラッグ先のコントロールは TextBox コントロールです。 コードでは、TextBox コントロールの Text プロパティをドラッグされたデータと同じ内容に設定します。
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString End Sub
private void textBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { textBox1.Text = e.Data.GetData(DataFormats.Text).ToString(); }
private void textBox1_DragDrop(Object sender, System.Windows.Forms.DragEventArgs e) { textBox1.set_Text (e.get_Data().GetData(DataFormats.Text).ToString()); }
注意
さらに、KeyState プロパティを使用して、ドラッグ アンド ドロップ操作中に押されたキーに応じて特定の効果が得られるようにできます。たとえば一般的に、Ctrl キーを押しながらドラッグしたデータはコピーされます。