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

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


person Community    schedule 16.09.2008    source источник
comment
Вы имеете в виду перетаскивание в приложении C # или в C # IDE?   -  person JamesSugrue    schedule 16.09.2008
comment
Конечно, приложение C #. Он хочет сделать свое приложение удобным для перетаскивания.   -  person SLA80    schedule 28.02.2010
comment
Дополнительные полезные ответы на ссылка.   -  person Venkatesh Kumar    schedule 31.08.2012


Ответы (10)


Пример кода:

  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);
    }
  }
person Hans Passant    schedule 18.09.2008
comment
Отказ от ответственности: он может не работать при отладке, если вы запускаете Visual Studio как администратор в Windows 7 или если вы запускаете свою программу как администратор. См. здесь - person Matthieu; 22.03.2012
comment
@Burnsys, если у вас есть путь к файлу из операции перетаскивания, вы можете читать, используя io.File - person Smith; 25.05.2013
comment
Разве класс не должен быть запечатанным, чтобы избежать виртуального вызова this.AllowDrop? stackoverflow.com/questions/119506/ - person CJBS; 11.02.2014
comment
Ух нет. Задайте для свойства AllowDrop значение True в конструкторе и рассмотрите его оттуда. - person Hans Passant; 11.02.2014
comment
Отличный фрагмент кода. У меня была программа, которая открывала файлы с помощью диалогового окна, и было легко добавить эту функцию и внести изменения, чтобы она работала так же, как открытое диалоговое окно, но с перетаскиванием. - person Caperneoignis; 13.07.2016
comment
Работает и в WPF, за исключением того, что событие DragDrop называется Drop. - person John Melville; 04.08.2017
comment
В чем разница между Enter и Drop? - person DjangoBlockchain; 01.03.2018
comment
@Childishforlife Enter - это когда вы удерживаете кнопку мыши и вводите ее в управление, все еще удерживая нажатой, а Drop - это момент, когда вы отпускаете кнопку мыши. - person Dominik Szymański; 05.09.2018

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

person Wayne Uroda    schedule 25.01.2011
comment
@Wayne Uroda: Я думал, что мой код не работает - черт возьми, он давал мне большой символ «Нет» вроде этого en.wikipedia.org/wiki/File:ProhibitedSign2.svg. Затем я увидел этот ответ и запустил VS как не администратор, и все работает! Бесконечно благодарен. - person Derek W; 03.06.2013
comment
Не могу отблагодарить вас за это, я бы сдался, если бы не нашел этот пост! Это так же актуально в Windows 10 в 2017 году, как и в момент написания. - person Culme; 19.01.2017

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

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

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

person Judah Gabriel Himango    schedule 16.09.2008

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

person Phil Wright    schedule 16.09.2008

Еще одна проблема:

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

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

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

person Guge    schedule 18.11.2008

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

person Craig Eddy    schedule 16.09.2008

Вот что-то, что я использовал для сброса файлов и / или папок, заполненных файлами. В моем случае я выполнял фильтрацию только для *.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);
    }
  }
person CAD bloke    schedule 19.04.2016

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

введите здесь описание изображения

введите здесь описание изображения

person Roland    schedule 05.02.2018

Вы можете реализовать Drag & Drop в WinForms и WPF.

  • WinForm (перетащите из окна приложения)

Вы должны добавить событие mousemove:

private void YourElementControl_MouseMove(object sender, MouseEventArgs e)

    {
     ...
         if (e.Button == MouseButtons.Left)
         {
                 DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
         }
     ...
    }
  • WinForm (перетащите в окно приложения)

Вам следует добавить событие DragDrop:

private void YourElementControl_DragDrop (отправитель объекта, DragEventArgs e)

    {
       ...
       foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
            {
                File.Copy(path, DirPath + Path.GetFileName(path));
            }
       ...
    }

Исходный код с полным кодом.

person Ernest Rutherford    schedule 27.04.2020

Обратите внимание, что для этого вам также необходимо установить dragDropEffect в _drawEnter ...

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    Console.WriteLine("DragEnter!");
    e.Effect = DragDropEffects.Copy;
}

Источник: Перетаскивание не работает в приложении C # Winforms < / а>

person Jack    schedule 16.07.2020