Английский   Русский  



Подписка



Partners
Главная :: Блог :: Drag&Drop в.NET на примере FileListView

Drag&Drop в.NET на примере FileListView


Сегодня я хочу показать вам, как добавить возможность перетаскивания Drag&Drop в программу, которая использует компонент Heapar .NET FileListView Control. Пример будет интересен не только тем, кто использует данный компонент, но и всем программистам .NET, потому что здесь описываются общие принципы создания Drag&Drop в .NET Framework. Та же технология может использоваться совершенно с любыми компонентами.

Создайте новое приложение и поместите на форму компонент FileListView. Для примера Drag&Drop нам понадобится еще одик компонент, на поверхность которого мы будем перетаскивать файлы или папки. Я для этого буду использовать Panel. Для панели сразу нужно изменить свойство AllowDrop на true. Для простоты я растянул этот компонент в доль кромки окна, как показао на следующем рисунке:

Window Form for Example

Создайте обработчик события 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


Copyright © Heapar Software 2009-2010. All rights reserved
Исходные коды и .NET библиотеки для программистов
Legal Notices | Privacy Policy