Пример. Выполнение операции перетаскивания в Windows Forms

Для выполнения операций перетаскивания в приложениях Windows необходимо обрабатывать последовательность событий, в первую очередь DragEnter, DragLeave и DragDrop. Работая со сведениями, доступными через аргументы этих событий, можно значительно упростить операции перетаскивания.

Перетаскивание данных

Все операции перетаскивания начинаются с переноса данных. Возможности сбора данных при начале перетаскивания реализуются в методе DoDragDrop.

В следующем примере событие MouseDown используется для начала операции перетаскивания, так как оно является самым удобным (большинство действий по перетаскиванию начинается, когда пользователь отпускает кнопку мыши). Однако не забывайте, что любое событие может использоваться для инициализации процедуры перетаскивания.

Примечание.

Некоторые элементы управления имеют собственные события перетаскивания. Например, у элементов управления ListView и TreeView есть событие ItemDrag.

Начало операции перетаскивания

  1. В событии MouseDown для элемента управления, в котором начнется перетаскивание, используйте метод DoDragDrop, чтобы определить данные для переноса и разрешенный результат перетаскивания. Дополнительные сведения см. в разделах Data и AllowedEffect.

    В следующем примере показан запуск операции перетаскивания. Элемент управления, в котором начинается перетаскивание, — это Button, переносимые данные — это строка, представляющая свойство Text элемента управления Button, а разрешенные результаты — копирование или перемещение.

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown  
       Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move)  
    End Sub  
    
    private void button1_MouseDown(object sender,
    System.Windows.Forms.MouseEventArgs e)  
    {  
       button1.DoDragDrop(button1.Text, DragDropEffects.Copy |
          DragDropEffects.Move);  
    }  
    

    Примечание.

    Любые данные можно использовать в качестве параметра в методе DoDragDrop. В примере выше использовалось (вместо жесткого задания значения или получения данных из набора данных) свойство Text элемента управления Button, так как это свойство было связано с расположением, из которого выполнялось перетаскивание (элемент управления Button). Учитывайте это при реализации операций перетаскивания в приложениях Windows.

Во время операции перетаскивания можно обрабатывать событие QueryContinueDrag, которое "запрашивает разрешение" системы на продолжение операции перетаскивания. При обработке этого метода он также является подходящей точкой для вызова методов, которые будут влиять на операцию перетаскивания, например расширение TreeNode в элементе управления TreeView при наведении на него курсора.

Завершение перетаскивания данных

После начала перетаскивания данных из расположения в форме Windows Forms или элементе управления их требуется куда-то поместить. При попадании курсора в область формы или элемента управления, которые правильно настроены для размещения данных, вид курсора изменится. Любую область формы или элемента управления Windows Forms можно настроить для принятия перетаскиваемых данных, задав свойство AllowDrop и предусмотрев обработку событий DragEnter и DragDrop.

Завершение операции перетаскивания

  1. Присвойте свойству AllowDrop значение true.

  2. В событии DragEnter для элемента управления, в который будут помещены данные, убедитесь, что перетаскиваемые данные относятся к допустимому типу (в данном случае Text). Затем код задает эффект, который будет происходить при завершении перетаскивания, как значение перечисления DragDropEffects. Дополнительные сведения см. в разделе Effect.

    Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter  
       If (e.Data.GetDataPresent(DataFormats.Text)) Then  
         e.Effect = DragDropEffects.Copy  
       Else  
         e.Effect = DragDropEffects.None  
       End If  
    End Sub  
    
    private void textBox1_DragEnter(object sender,
    System.Windows.Forms.DragEventArgs e)  
    {  
       if (e.Data.GetDataPresent(DataFormats.Text))
          e.Effect = DragDropEffects.Copy;  
       else  
          e.Effect = DragDropEffects.None;  
    }  
    

    Примечание.

    Вы можете определить собственные форматы DataFormats, указав собственный объект в качестве параметра Object метода SetData. При этом необходимо убедиться, что указанный объект является сериализуемым. Дополнительные сведения см. в разделе ISerializable.

  3. В событии DragDrop для элемента управления, в котором будет завершено перетаскивание, используйте метод GetData для получения перетаскиваемых данных. Дополнительные сведения см. в разделе Data.

    В следующем примере элемент TextBox является элементом управления, в который переносятся данные (в котором будет завершено их перетаскивание). Код задает свойство Text элемента управления TextBox равным перетаскиваемым данным.

    Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop  
       TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString  
    End Sub  
    
    private void textBox1_DragDrop(object sender,
    System.Windows.Forms.DragEventArgs e)  
    {  
       textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();  
    }  
    

    Примечание.

    Кроме того, можно работать со свойством KeyState, чтобы в зависимости от клавиш, отпущенных во время операции перетаскивания, происходили определенные действия (например, копирование переносимых данных, как правило, выполняется при нажатии клавиши CTRL).

См. также