Как перетащить файлы в приложение?

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

Ответ 1

Пример кода:

  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);
    }
  }

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Еще один вопрос:

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

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

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

Ответ 6

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

Ответ 7

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

fileList является IEnumerable или подобным. В моем случае он был связан с элементом управления WPF...

var fileList = (IList)FileList.ItemsSource;

Подробнее об этом трюке см. fooobar.com/info/32819/....

Обработчик капель...

  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);
    }
  }