Як перетягувати файли в програму?


251

Я бачив це в середовищі Turbo C ++ Borland , але я не впевнений, як це зробити для програми C #, над якою працюю. Чи є найкращі практики чи привітання, на які слід звернути увагу?


Ви маєте на увазі перетягування в додаток C # або в C # IDE?
JamesSugrue

4
Зрозуміло, додаток C #. Він хоче зробити свою програму дружньою для перетягування.
SLA80

3
Більше корисних відповідей за посиланням .
Венкатеш Кумар

Відповіді:


505

Деякі зразки коду:

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

56
Відмова від відповідальності: вона може не працювати при налагодженні, якщо ви запускаєте Visual Studio як адміністратор в Windows 7 або якщо ви запускаєте програму як адміністратор. Дивіться тут
Матьє

Як ви отримуєте вміст файлів?
Бернсіс

3
@Burnsys, якщо у вас є шлях файлу від операції перетягування, ви можете читати, використовуючиio.File
Smith

1
Тьфу, ні. Встановіть для дизайнера властивість AllowDrop значення True та обґрунтуйте це звідти.
Ганс Пасант

2
Чи чудовий (string[])лит безпечний для будь-яких FileDropформатних крапель? Тобто, чи можна створити таке, FileDropщо спричинить незаконне виключення у складі string[]? У мене виникають проблеми з з'ясуванням цього документа .
kdbanman

140

Будьте в курсі прав безпеки Windows vista / Windows 7 - якщо ви використовуєте Visual Studio як адміністратор, ви не зможете перетягувати файли з вікна провідника без адміністратора у вашу програму, коли ви запускаєте його з візуальної студії. Події, пов’язані з перетягуванням, навіть не спрацюють! Я сподіваюся, що це допомагає комусь іншому там не витрачати години свого життя ...


6
@Wayne Uroda: Я думав, що мій код не працює - чорт, він дав мені великий "Без символу", як це en.wikipedia.org/wiki/File:ProhibitionSign2.svg . Тоді я побачив цю відповідь і запустив VS як не-адміністратора, і це швидко працює! Завдяки мільйонів.
Дерек Ш

Не можу вам подякувати за це, я б відмовився, якби не знайшов цю посаду! Це так само дійсно в Windows 10 у 2017 році, як і коли ви його писали.
Culme

42

У Windows Forms встановіть властивість AllowDrop управління, а потім прослухайте події DragEnter та події DragDrop.

Коли DragEnterподія спрацьовує, встановіть аргумент AllowedEffectна щось інше (наприклад e.Effect = DragDropEffects.Move).

Коли DragDropподія розпочнеться, ви отримаєте список рядків. Кожен рядок - це повний шлях до файлу, що випадає.


16

Ви повинні бути в курсі гатчі. Будь-який клас, який ви передаєте як DataObject в операції перетягування / падіння, повинен бути серіалізаційним. Тож якщо ви спробуєте передати об’єкт, і він не працює, переконайтеся, що його можна серіалізувати, оскільки це майже напевно проблема. Це мене кілька разів піймало!


14

Ще одна готча:

Рамковий код, що викликає події Drag, поглинає всі винятки. Ви можете подумати, що код події працює безперебійно, в той час як він повсякчас сильно виключає винятки. Ви не можете їх бачити, оскільки рамка їх краде.

Ось чому я завжди вкладаю спробу / лову в ці обробники подій, просто так я знаю, чи вони викидають якісь винятки. Я зазвичай ставлю Debugger.Break (); у частині улову.

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


9

Інша поширена проблема - це те, що ви можете ігнорувати події DragOver форми (або DragEnter). Зазвичай я використовую подію DragOver форми для встановлення AllowedEffect, а потім події DragDrop конкретного елемента управління для обробки викинутих даних.


7

Ось щось я використав для видалення файлів та / або папок, повних файлів. У моєму випадку я фільтрував *.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);
    }
  }

3

Рішення Джуди Хіманго та Ганса Пасанта доступне в Дизайнері (я зараз використовую VS2015):

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

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


0

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

  • WinForm (перетягнути з вікна програми)

Ви повинні додати подію переміщення миші:

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:

приватна недійсна YourElementControl_DragDrop (відправник об'єкта, DragEventArgs e)

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

Джерело з повним кодом .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.