it-swarm-ru.tech

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

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

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

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

127
Wayne Uroda

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

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

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

40
Judah Gabriel Himango

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

16
Phil Wright

Еще одна ошибка:

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

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

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

10
Guge

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

fileList - это IEnumerable или подобное В моем случае был привязан к элементу управления 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

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

6
Craig Eddy

Решение Judah Himango и Hans Passant доступно в Designer (сейчас я использую VS2015): enter image description here enter image description here

0
Roland