ドラッグ&ドロップ

ドラッグされる側 (ソース)

DoDragDrop()

public System.Windows.Forms.DragDropEffects DoDragDrop (
    object data,
    System.Windows.Forms.DragDropEffects allowedEffects
    );
Control.DoDragDrop(Object, DragDropEffects) Method (System.Windows.Forms) | Microsoft Learn

ドロップされた側が処理を完了するまで、このメソッドへは処理は戻りません。

QueryContinueDrag

Control.QueryContinueDrag Event (System.Windows.Forms) | Microsoft Learn

ドロップされる側 (ターゲット)

ドロップのイベントを受け取るには、AllowDropプロパティをtrueにします。

ドラッグのイベント ハンドラが処理を返すまでドラッグされた側は処理を続行できないため、即座に処理を完了させます。

DragEnter

Ctrlキーなどの状態によってドラッグの処理を切り替えるならば、DragOverイベントで処理します。DragEnterは領域内へ入ったときにしか発生しないため、領域内でキーの状態が変更されても、それに応じた処理ができません。

protected override void OnDragEnter(DragEventArgs drgevent)
{
    base.OnDragEnter(drgevent);

    if (drgevent.Data.GetDataPresent(DataFormats.FileDrop)
     || drgevent.Data.GetDataPresent(DataFormats.UnicodeText))
    {
        drgevent.Effect = DragDropEffects.Copy;
    }
    else
    {
        drgevent.Effect = DragDropEffects.None;
    }
}

protected override void OnDragDrop(DragEventArgs drgevent)
{
    base.OnDragDrop(drgevent);

    if (drgevent.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] files = (string[])drgevent.Data.GetData(DataFormats.FileDrop);
    }
    else if (drgevent.Data.GetDataPresent(DataFormats.UnicodeText))
    {
        string text = (string)drgevent.Data.GetData(DataFormats.UnicodeText);
    }


    this.BeginInvoke((MethodInvoker)delegate
    {
        // 時間のかかる処理は非同期で実行する
    });
}

DragOver

protected override void OnDragOver(DragEventArgs drgevent)
{
    base.OnDragOver(drgevent);

    if (drgevent.Data.GetDataPresent(DataFormats.Text))
    {
        if ((drgevent.KeyState & 0x08) != 0 // Ctrl key
            && (drgevent.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
        {
            drgevent.Effect = DragDropEffects.Copy;
        }
        else if ((drgevent.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
        {
            drgevent.Effect = DragDropEffects.Move;
        }
        else
        {
            drgevent.Effect = DragDropEffects.None;
        }
    }
}

ドラッグ時のアイコン表示

コントロール上をファイルがドラッグされたときに、そのファイルのアイコンを表示するには、COMのDrag-and-Drop Helper Objectを利用します。

Microsoft Learnから検索