次の方法で共有


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

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

データのドラッグ

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

次の例では、MouseDown イベントは最も直感的であるため、ドラッグ操作を開始するために使用されます (ドラッグ アンド ドロップ操作の多くは、マウス ボタンが押された状態から始まります)。 ただし、任意のイベントを使用してドラッグ アンド ドロップ プロシージャを開始できることに注意してください。

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

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

  1. ドラッグが開始されるコントロールの MouseDown イベントで、DoDragDrop メソッドを使用して、ドラッグするデータを設定し、ドラッグできる効果を設定します。 詳細については、「DataAllowedEffect」を参照してください。

    次の例は、ドラッグ操作を開始する方法を示しています。 ドラッグが開始されるコントロールは Button コントロール、ドラッグされるデータは Text コントロールの Button プロパティを表す文字列であり、許可される効果はコピーまたは移動のいずれかです。

    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 メソッドでは、任意のデータをパラメーターとして使用できます。上の例では、プロパティがドラッグされる場所 (Text コントロール) に関連付けられているため、Button コントロールの 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;
    }
    

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

  3. ドロップが発生するコントロールの DragDrop イベントで、GetData メソッドを使用して、ドラッグされるデータを取得します。 詳細については、Dataを参照してください。

    次の例では、TextBox コントロールがドラッグ先の (ドロップが発生する) コントロールです。 このコードは、Text コントロールの TextBox プロパティを、ドラッグするデータと等しく設定します。

    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 キーを押したときにドラッグされたデータをコピーするのが標準です)。

こちらも参照ください