ドラッグ&ドロップに対応する

基本的な処理の流れは以下の通り

  1. DragEnterイベントを作る
  2. senderに対してDragDropEffects.Copyを行なう
  3. DragDropイベントを作る

2番目のDragDropEffects.Copyを行なわないとDragDropイベントは発生しません

ということで書いてみる

private void foo_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        // ドラッグ中のファイルやディレクトリの取得
        string[] drags = (string[])e.Data.GetData(DataFormats.FileDrop);
        // ディレクトリの場合は System.IO.Directory.Exsits を使う
        if (drags.Length > 1 || !System.IO.File.Exists((string)drags[0]))
        {
            return;
        }
        e.Effect = DragDropEffects.Copy;
    }
}

private void foo_DragDrop(object sender, DragEventArgs e)
{
    // ドラッグ&ドロップされたファイル
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
    this.fooTextBox.Text = files[0]; // pathを表示
}

複数のファイルが選択された状態でのDragは許可しないようにした
許可する場合は drags.Length > 1 を外して、foreachを利用して存在を確認するようにすればいい