Как перетащить файлы в приложение? - PullRequest
231 голосов
/ 16 сентября 2008

Я видел, как это делается в среде Borland Turbo C ++ , но я не уверен, как это сделать для приложения на C #, над которым я работаю. Есть ли лучшие практики или ошибки, на которые стоит обратить внимание?

Ответы [ 8 ]

479 голосов
/ 18 сентября 2008

Пример кода:

  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);
    }
  }
132 голосов
/ 25 января 2011

Помните о правах безопасности Windows Vista / Windows 7 - если вы используете Visual Studio от имени администратора, вы не сможете перетаскивать файлы из окна обозревателя, не являющегося администратором, в вашу программу при запуске из Visual Studio. События, связанные с перетаскиванием, даже не сработают! Я надеюсь, что это помогает кому-то еще не тратить часы своей жизни ...

40 голосов
/ 16 сентября 2008

В Windows Forms установите свойство AllowDrop элемента управления, затем прослушайте событие DragEnter и событие DragDrop.

Когда происходит событие DragEnter, установите для аргумента AllowedEffect значение, отличное от none (например, e.Effect = DragDropEffects.Move).

Когда сработает событие DragDrop, вы получите список строк. Каждая строка - это полный путь к удаляемому файлу.

16 голосов
/ 16 сентября 2008

Вы должны знать о гоче. Любой класс, который вы передаете как DataObject в операции перетаскивания, должен быть сериализуемым. Поэтому, если вы попытаетесь передать объект, и он не работает, убедитесь, что он может быть сериализован, так как это почти наверняка является проблемой. Это поймало меня пару раз!

12 голосов
/ 19 ноября 2008

Еще один гоча:

Код платформы, вызывающий Drag-события, поглощает все исключения. Вы можете подумать, что код вашего события работает без сбоев, в то время как он генерирует исключения повсюду. Вы не можете их видеть, потому что их украл каркас.

Вот почему я всегда помещаю try / catch в эти обработчики событий, просто чтобы знать, генерируют ли они какие-либо исключения. Я обычно ставлю Debugger.Break (); в подвохе.

Перед выпуском, после тестирования, если кажется, что все работает, я удаляю или заменяю их реальной обработкой исключений.

7 голосов
/ 19 апреля 2016

Вот кое-что, что я использовал для удаления файлов и / или папок, полных файлов. В моем случае я фильтровал только файлы *.dwg и решил включить все подпапки.

fileList является IEnumerable или подобным

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 голосов
/ 16 сентября 2008

Другая распространенная ошибка - думать, что вы можете игнорировать события Form DragOver (или DragEnter). Я обычно использую событие DragOver формы, чтобы установить AllowedEffect, а затем событие DragDrop определенного элемента управления для обработки отброшенных данных.

0 голосов
/ 05 февраля 2018

Решение Джуды Химанго и Ханса Пассанта доступно в Designer (я в настоящее время использую VS2015): enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...