Share via


チュートリアル: Windows フォームにおけるドラッグ アンド ドロップ操作の実行

Windows ベースのアプリケーションでドラッグ アンド ドロップ操作を実行するには、一連のイベント (特に、DragEnterDragLeaveDragDrop イベント) を処理する必要があります。 これらのイベントのイベント引数で使用できる情報を操作することにより、ドラッグ アンド ドロップ操作を簡単に容易にすることができます。

データのドラッグ

すべてのドラッグ アンド ドロップ操作は、ドラッグで始まります。 ドラッグの開始時にデータを収集できるようにする機能は、DoDragDrop メソッドで実装されています。

次の例では、それが最も直観的であるため (ほとんどのドラッグ アンド ドロップ操作は、マウス ボタンの押下で開始されます)、ドラッグ操作を開始するのに MouseDown イベントが使用されています。 ただし、どのようなイベントでもドラッグ アンド ドロップ手順を開始するのに使用できることに注意してください。

注意

特定のコントロールには、ドラッグ固有のカスタム イベントがあります。 たとえば、ListViewTreeView コントロールには、ItemDrag イベントがあります。

ドラッグ操作を開始するには

  1. ドラッグを開始するコントロールの 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);  
    }  
    

    注意

    任意のデータを、DoDragDrop メソッドのパラメーターとして使用できます。上の例では、(値をハードコーディングしたり、データセットからデータを取得したりする代わりに) Button コントロールの Text プロパティを使用しました。これは、そのプロパティがドラッグ元の場所 (Button コントロール) に関連付けられていたためです。 ドラッグ アンド ドロップ操作を Windows ベースのアプリケーションに組み込むときは、この点に注意してください。

ドラッグ操作が有効になっている間に、QueryContinueDrag イベントを処理できます。そこでは、ドラッグ操作を続行するためにシステムの "アクセス許可が要求" されます。 このメソッドを処理するときは、ドラッグ操作に影響を与えるメソッドを呼び出すのに適したタイミングでもあります。たとえば、カーソルでポイントされた TreeNode コントロールの TreeView を展開する場合などです。

データのドロップ

Windows フォームまたはコントロール上の場所からデータのドラッグを始めた後は、普通、どこかにそれをドロップします。 データのドロップ用に正しく構成されているフォームまたはコントロールの領域に入ると、カーソルが変化します。 AllowDrop プロパティを設定し、DragEnter および DragDrop イベントを処理することにより、Windows フォームまたはコントロール内の任意の領域で、ドロップされたデータを受け入れることができます。

ドロップを実行するには

  1. AllowDrop プロパティを true に設定します。

  2. ドロップが発生するコントロールの 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;  
    }  
    

    注意

    独自のオブジェクトを SetData メソッドの Object パラメーターとして指定することで、独自の DataFormats を定義できます。 これを行うときは、指定するオブジェクトがシリアル化可能であることを確認してください。 詳細については、「ISerializable」を参照してください。

  3. ドロップが発生するコントロールの DragDrop イベントで、GetData メソッドを使用して、ドラッグされているデータを取得します。 詳細については、「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();  
    }  
    

    注意

    また、KeyState プロパティを使用することで、ドラッグ アンド ドロップ操作の間に押されたキーに応じて、特定の効果を発生させることもできます (たとえば、Ctrl キーが押されたら、ドラッグされているデータをコピーするのが標準的です)。

関連項目