it-swarm-id.com

Bagaimana cara saya drag and drop file ke dalam aplikasi?

Saya telah melihat ini dilakukan di Borland's Turbo C++ environment, tapi saya tidak yakin bagaimana melakukannya untuk aplikasi C # yang saya kerjakan. Apakah ada praktik terbaik atau tantangan yang harus diwaspadai?

225
Samuel Paul

Beberapa kode contoh:

  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);
    }
  }
473
Hans Passant

Waspadai hak keamanan windows Vista/windows 7 - jika Anda menjalankan Visual Studio sebagai administrator, Anda tidak akan dapat menyeret file dari jendela Explorer non-administrator ke dalam program saat Anda menjalankannya dari dalam studio visual. Peristiwa terkait seret bahkan tidak akan menyala! Saya harap ini membantu orang lain di luar sana untuk tidak membuang-buang waktu hidup mereka ...

127
Wayne Uroda

Di Windows Forms, setel properti AllowDrop kontrol, lalu dengarkan acara DragEnter dan acara DragDrop.

Saat acara DragEnter menyala, atur AllowedEffect argumen menjadi sesuatu selain yang tidak ada (mis. e.Effect = DragDropEffects.Move).

Saat acara DragDrop menyala, Anda akan mendapatkan daftar string. Setiap string adalah path lengkap ke file yang dijatuhkan.

40

Anda harus menyadari adanya gotcha. Setiap kelas yang Anda lewati sebagai DataObject dalam operasi seret/lepas harus Serializable. Jadi, jika Anda mencoba dan melewatkan objek, dan itu tidak berfungsi, pastikan itu dapat diserialisasi karena itu hampir pasti masalahnya. Ini telah menangkap saya beberapa kali!

16
Phil Wright

Gotcha lainnya:

Kode kerangka kerja yang memanggil Drag-events menelan semua pengecualian. Anda mungkin berpikir kode acara Anda berjalan dengan lancar, sementara itu memunculkan pengecualian di semua tempat. Anda tidak dapat melihat mereka karena kerangka kerja mencuri mereka.

Itu sebabnya saya selalu mencoba/menangkap dalam event handler ini, hanya supaya saya tahu jika mereka memberikan pengecualian. Saya biasanya meletakkan Debugger.Break (); di bagian tangkapan.

Sebelum dirilis, setelah pengujian, jika semuanya tampak berperilaku, saya menghapus atau mengganti ini dengan penanganan pengecualian nyata.

10
Guge

Ini adalah sesuatu yang saya gunakan untuk meletakkan file dan/atau folder yang penuh dengan file. Dalam kasus saya, saya memfilter hanya untuk file *.dwg dan memilih untuk memasukkan semua subfolder.

fileList adalah IEnumerable atau serupa Dalam kasus saya terikat dengan kontrol WPF ... 

var fileList = (IList)FileList.ItemsSource;

Lihat https://stackoverflow.com/a/19954958/492 untuk detail trik itu.

Drop Handler ...

  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

Gotcha umum lainnya adalah berpikir Anda dapat mengabaikan acara Form DragOver (atau DragEnter). Saya biasanya menggunakan acara DragOver Formulir untuk mengatur DiizinkanEffect, dan kemudian acara DragDrop kontrol tertentu untuk menangani data yang jatuh.

6
Craig Eddy

Solusi Judah Himango dan Hans Passant tersedia di Perancang (Saya saat ini menggunakan VS2015):  enter image description here  enter image description here

0
Roland