web-dev-qa-db-ja.com

ファイルをアプリケーションにドラッグアンドドロップするにはどうすればよいですか?

私はこれをBorlandの Turbo C++ 環境で見ましたが、私が取り組んでいるC#アプリケーションでどのようにそれを実行するのかわかりません。注意すべきベストプラクティスや落とし穴はありますか?

231
Samuel Paul

いくつかのサンプルコード:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      this.AllowDrop = true;
      this.DragEnter += new DragEventHandler(Form1_DragEnter);
      this.DragDrop += new DragEventHandler(Form1_DragDrop);
    }

    void Form1_DragEnter(object sender, DragEventArgs e) {
      if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
    }

    void Form1_DragDrop(object sender, DragEventArgs e) {
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      foreach (string file in files) Console.WriteLine(file);
    }
  }
479
Hans Passant

Windows Vista/Windows 7のセキュリティ権限に注意してください-Visual Studioを管理者として実行している場合、Visual Studio内から実行する場合、管理者以外のExplorerウィンドウからプログラムにファイルをドラッグすることはできません。ドラッグ関連のイベントは発生しません!これが、人生の何時間も無駄にしない他の誰かに役立つことを願っています...

132
Wayne Uroda

Windowsフォームで、コントロールのAllowDropプロパティを設定し、DragEnterイベントとDragDropイベントをリッスンします。

DragEnterイベントが発生したら、引数のAllowedEffectをnone以外に設定します(例:e.Effect = DragDropEffects.Move)。

DragDropイベントが発生すると、文字列のリストを取得します。各文字列は、ドロップされるファイルへのフルパスです。

40

落とし穴に注意する必要があります。ドラッグ/ドロップ操作で DataObject として渡すクラスはすべて、Serializableである必要があります。したがって、オブジェクトを渡そうとしても機能しない場合は、それがほとんど確実に問題であるため、シリアル化できることを確認してください。これは私を数回キャッチしました!

16
Phil Wright

さらに別の落とし穴:

ドラッグイベントを呼び出すフレームワークコードは、すべての例外を飲み込みます。イベントコードはスムーズに実行されていると思うかもしれませんが、例外はあちこちで発生しています。フレームワークがそれらを盗むので、それらを見ることができません。

そのため、これらのイベントハンドラーに常にtry/catchを配置します。例外がスローされるかどうかを確認するためです。通常、Debugger.Break();を配置します。キャッチ部分で。

リリース前、テスト後、すべてが動作しているようであれば、これらを削除するか、実際の例外処理に置き換えます。

12
Guge

もう1つのよくある落とし穴は、Form DragOver(またはDragEnter)イベントを無視できると考えることです。通常、フォームのDragOverイベントを使用してAllowedEffectを設定し、特定のコントロールのDragDropイベントを使用して、ドロップされたデータを処理します。

7
Craig Eddy

これは、ファイルやファイルでいっぱいのフォルダーをドロップするために使用したものです。私の場合、*.dwgファイルのみをフィルタリングし、すべてのサブフォルダーを含めることを選択しました。

fileListIEnumerableまたは同様のものです。私の場合、WPFコントロールにバインドされていました...

var fileList = (IList)FileList.ItemsSource;

https://stackoverflow.com/a/19954958/492 をご覧ください。

ドロップハンドラー...

  private void FileList_OnDrop(object sender, DragEventArgs e)
  {
    var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
    var files = dropped.ToList();

    if (!files.Any())
      return;

    foreach (string drop in dropped)
      if (Directory.Exists(drop))
        files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));

    foreach (string file in files)
    {
      if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
        fileList.Add(file);
    }
  }
7
CAD bloke

Judah HimangoとHans Passantのソリューションは、Designerで利用できます(現在VS2015を使用しています): enter image description hereenter image description here

0
Roland