15 мар. 2012 г.

Получение имен файлов при перетаскивании их в целевые объекты пользовательского интерфейса

      Перетаскиванием обычно называют метод передачи данных, который реализуется с помощью мыши (или другого указывающего устройства) для выбора одного или нескольких объектов и перетаскивания их в целевые объекты пользовательского интерфейса. События и методы необходимые для операций перетаскивания, определяются в классе «DragDrop».
      Для включения отслеживания событий «Drag and Drops», необходимо установить в элементе управления свойство «AllowDrop» в «true» и использовать одно или несколько следующих событий:

  • DragEnter - Происходит при завершении операции перетаскивания;
  • DragOver - Происходит, когда элемент перетаскивается с помощью мыши в клиентскую область этого элемента;
  • DragLeave - Происходит, когда объект перетаскивается на элемент управления;
  • DragDrop - Происходит, когда объект перетаскивается за пределы элемента управления;
  • GiveFeedback - Происходит, когда элемент перетаскивается с помощью мыши. Система запрашивает у элемента управления обеспечения обратной совместимости с этим эффектом;
  • QueryContinueDrag - Происходит при перетаскивании элемента. Система опрашивает, можно ли продолжать операцию перетаскивания мышью.
      Чтобы обработать перетаскивание одного или нескольких файлов внутрь элемента управления, необходимо обработать два события: «DragEnter» и «DragDrop». В «DragEnter» выполняется проверка, что перетаскиваемый элемент имеет тип «DataFormats.FileDrop». Если данное условие выполняется, то операция перетаскивания разрешается с установкой значения «DragDropEffects.All», иначе «DragDropEffects.None», указывающее, что целевой объект не принимает данные.
Событие «DragDrop» получает список файлов для помещения в элемент с помощью метода «GetData» и добавляет их в массив строк. Каждый элемент массива будет содержать полный путь и имя к каждому файлу, помещенному в элемент управления.
      В данной статье рассмотрено обнаружение перетаскивания объектов в приложения Windows Forms с использованием .NET Framework.


      Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на форму следующие элементы управления:
  • System.Windows.Forms.CheckedListBox checkedListBox1;
  • System.Windows.Forms.ComboBox comboBox1;
  • System.Windows.Forms.ListBox listBox1;
  • System.Windows.Forms.TextBox textBox1;
  • System.Windows.Forms.TreeView treeView1;
У вас получится приведенный ниже пример.
      Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг, установки имен методов на определенные события элементов управления расположенных на форме.
checkedListBox1.AllowDrop = true;
checkedListBox1.DragEnter += new DragEventHandler(checkedListBox1_DragEnter);
checkedListBox1.DragDrop += new DragEventHandler(checkedListBox1_DragDrop);

listBox1.AllowDrop = true;
listBox1.DragEnter += new DragEventHandler(listBox1_DragEnter);
listBox1.DragDrop += new DragEventHandler(listBox1_DragDrop);

comboBox1.AllowDrop = true;
comboBox1.DragEnter += new DragEventHandler(comboBox1_DragEnter);
comboBox1.DragDrop += new DragEventHandler(comboBox1_DragDrop);

textBox1.AllowDrop = true;
textBox1.DragEnter += new DragEventHandler(textBox1_DragEnter);
textBox1.DragDrop += new DragEventHandler(textBox1_DragDrop);

treeView1.AllowDrop = true;
treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter);
treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop);
      Так же добавьте в листинг главной формы, приведенные ниже методы обработки перетаскиваемых файлов в элементы управления формы.
private void checkedListBox1_DragEnter(object sender, DragEventArgs e)
{
    //Разрешаем Drop только файлам
    e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? 
                DragDropEffects.All : DragDropEffects.None;
}

private void checkedListBox1_DragDrop(object sender, DragEventArgs e)
{
    //Извлекаем имя перетаскиваемого файла
    string[] strings = (string[])e.Data.GetData(DataFormats.FileDrop, true);
    checkedListBox1.Items.Add(strings[0]);
}

private void listBox1_DragEnter(object sender, DragEventArgs e)
{
    //Разрешаем Drop только файлам
    e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? 
                DragDropEffects.All : DragDropEffects.None;
}

private void listBox1_DragDrop(object sender, DragEventArgs e)
{
    //Извлекаем имя перетаскиваемого файла
    string[] strings = (string[])e.Data.GetData(DataFormats.FileDrop, true);
    listBox1.Items.Add(strings[0]);
}

private void comboBox1_DragEnter(object sender, DragEventArgs e)
{
    //Разрешаем Drop только файлам
    e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? 
                DragDropEffects.All : DragDropEffects.None;
}

private void comboBox1_DragDrop(object sender, DragEventArgs e)
{
    //Извлекаем имя перетаскиваемого файла
    string[] strings = (string[])e.Data.GetData(DataFormats.FileDrop, true);
    comboBox1.Items.Add(strings[0]);
}

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
    //Разрешаем Drop только файлам
    e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? 
                DragDropEffects.All : DragDropEffects.None;
}

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    //Извлекаем имя перетаскиваемого файла
    string[] strings = (string[])e.Data.GetData(DataFormats.FileDrop, true);
    textBox1.Text = strings[0];
}
      Приведенные выше методы добавляют только один файл в перетаскиваемый элемент управления, в не того сколько файлов вы пытались перетащить. Ниже представлены методы для элемента управления «treeView1», которые добавляют имена и полный путь к ним, всех перетаскиваемых файлов. Добавьте данные методы в листинг главной формы.
private void treeView1_DragEnter(object sender, DragEventArgs e)
{
    //Разрешаем Drop только файлам
    e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? 
                DragDropEffects.All : DragDropEffects.None;
}

private void treeView1_DragDrop(object sender, DragEventArgs e)
{
    //Извлекаем имена перетаскиваемых файлов
    string[] FileList = (string[])e.Data.GetData(DataFormats.FileDrop, true);
    foreach (string File in FileList)
        treeView1.Nodes.Add(File);
}
      Запустите ваш проект, нажав на клавиатуре клавишу «F5». У вас откроется главная форма проекта, выберете в проводнике несколько файлов и перетащите их на любой элемент управления. После перетаскивания фалов, их имена и полный путь к ним, должны отобразиться в конечном элементе управления.

Ссылка для скачивания примера: Яндекс.Диск