Реализация Drag and drop в WinForms приложении на C#

{lang: 'ru'}

.NET Framework позволяет легко обнаруживать перетаскиваемые объекты в/из приложения Windows Forms. Для этого можно использовать одно или несколько из доступных событий drag and drop. В обработчиках этих событий можно проверить, является ли объект файлом.

image

Для включения отслеживания событий drag and drops, нужно установить свойство AllowDrop в true и использовать одно или несколько следующих событий:

  • DragEnter: Возникает при завершении операции перетаскивания
  • DragOver: Происходит, когда элемент перетаскивается с помощью мыши в клиентскую область этого элемента.
  • DragDrop: Возникает, когда объект перетаскивается за пределы элемента управления.
  • DragLeave: Возникает, когда объект перетаскивается на элемент управления.
  • GiveFeedback: Происходит, когда элемент перетаскивается с помощью мыши. Система запрашивает у элемента управления обеспечения обратной совместимости с этим эффектом.
  • QueryContinueDrag: Происходит при перетаскивании элемента. Система опрашивает, можно ли продолжать операцию перетаскивания мышью.

Чтобы обработать перетаскивание одного или нескольких файлов внутрь элемента управления, необходимо обработать два события: DragEnter и DragDrop. В DragEnter мы проверяем, что перетаскиваемый элемент имеет тип DataFormats.FileDrop. Если это так, операция перетаскивания правда операция перетаскивания разрешается. Событие DragDrop получает список файлов для помещения в элемент с помощью метода GetData и добавляет их в массив строк. Каждый элемент массива будет содержать полный путь к каждому файлу, помещенному в элемент управления.


Статья написана по мотивам оригинальной англоязычной версии. Исходный код с работающим примером так же доступен по ссылке из неё.


Полезная статья? Их будет больше, если вы поддержите меня!


  • Возникла проблема, когда я хочу перетащить файл с проводника в программу на элемент panel и чтобы этот файл отобразился на элементе picturebox то при перетаскивании не происходит ни чего.

  • Разобрался, нужно было AllowDrop  ставить true