
Сегодня я хочу показать вам, как добавить возможность перетаскивания Drag&Drop в программу, которая использует компонент Heapar .NET FileListView Control. Пример будет интересен не только тем, кто использует данный компонент, но и всем программистам .NET, потому что здесь описываются общие принципы создания Drag&Drop в .NET Framework. Та же технология может использоваться совершенно с любыми компонентами.
Создайте новое приложение и поместите на форму компонент FileListView. Для примера Drag&Drop нам понадобится еще одик компонент, на поверхность которого мы будем перетаскивать файлы или папки. Я для этого буду использовать Panel. Для панели сразу нужно изменить свойство AllowDrop на true. Для простоты я растянул этот компонент в доль кромки окна, как показао на следующем рисунке:
Создайте обработчик события ItemDrag для компонента FileListView. В созданной функции обработчика напишем следующий код:
private void fileListView1_ItemDrag(object sender, ItemDragEventArgs e)
{
try
{
if (e.Button == MouseButtons.Right)
return;
ListViewItem item = (ListViewItem)e.Item;
DoDragDrop(fileListView1.FileSystemItems[item.Index], DragDropEffects.Copy);
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message);
}
}
Основная задача кода определить, какой элемент сейчас перетягивается и начать его перетягивание. Элемент, который тянтся можно получить в свойстве Item переменной e, которую мы получаем во втором параметре функции обработчика события. После этого вызываем функцию DoDragDrop. Ей в первом параметре передается элемент, который будет перетаскиваться, а во втором параметре метод. Метод будет копирование, поэтому укажем DragDropEffects.Copy.
А вот с элементом перетягивания чуть интереснее. Тут желательно сразу же указать объект, который увидит компонент, на поверхности которого будет отпущена кнопка после перетягивания, т.е. это должен быть объект перетягиваемого файла. В Heapar .NET FileListView Control все файлы представлены в виде объектв ShellItem. Чтобы получить объект этого типа для перетягиваемого элемента, просто обращяемся к нему по индексу. Индекс перетягиваемого элемента это item.Index (а если в полном виде то ((ListViewItem)e.Item).Index), а массив объектов файлов находится в свойстве FileSystemItems.
Теперь создаем обработчик события DragEnter и DragOver для панели Panel control. Первый из них вызывается когда перетягиваемый объект и курсор входит в област панели, а второй, когда объект перетягивается над компонентом. Код для этих обработчиков будет следующим:
private void panel1_DragOver(object sender, DragEventArgs e)
{
if (e.Data == null)
{
e.Effect = DragDropEffects.None;
return;
}
else if (e.Data.GetDataPresent("heaparessential.HeaparFileSystem.ShellItem"))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
private void panel1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect;
}
Самым интересным тут является обработчик события DragOver, потому что в нем мы должны определить тип перетягиваемого объекта. Если это будет файл, то нужно разрешить бросание объекта. Если же это тянут другой объект, то нужно в e.Effect поместить DragDropEffects.None.
Последнее, что мы делаем, это создаем обработчик события DragDrop для панели Panel:
private void panel1_DragDrop(object sender, DragEventArgs e)
{
ShellItem shellitem =
(ShellItem)e.Data.GetData("heaparessential.HeaparFileSystem.ShellItem");
if (shellitem == null)
return;
else
label1.Text = shellitem.Path;
}
В первой строке получаем объект перетаскивание. Это то, что мы передали функции DoDragDrop, когда начинали перетягивание. Если результат не нулевой, то нам все удалось , и мы можем работать с объектом файла, в том числе и отображать его путь.
Исходный код примера включен в пакет компонента, который вы можете скачать здесь: .NET FileListView Control