Поделиться через


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

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

Перенос данных

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

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

Примечание

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

Чтобы начать операцию переноса, выполните следующие действия.

  • В событии 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);
    }
    
    private void button1_MouseDown(Object sender,
    System.Windows.Forms.MouseEventArgs e)
    {
       button1.DoDragDrop(button1.get_Text(), DragDropEffects.Copy |
          DragDropEffects.Move);
    }
    

    Примечание

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

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

Освобождение данных

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

Чтобы осуществить освобождение данных, выполните следующие действия.

  1. Задайте значение "true" свойству AllowDrop.

  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;
    }
    
    private void textBox1_DragEnter(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       if (e.get_Data().GetDataPresent(DataFormats.Text))
          e.set_Effect(DragDropEffects.Copy);
       else
          e.set_Effect(DragDropEffects.None);
    }
    

    Примечание

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

  3. В событии DragDrop для элемента управления, в котором будут размещены данные, используйте метод GetData для получения перетаскиваемых данных. Дополнительные сведения см. в разделе Свойство DtaObject.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();
    }
    
    private void textBox1_DragDrop(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       textBox1.set_Text
    (e.get_Data().GetData(DataFormats.Text).ToString());
    }
    

    Примечание

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

См. также

Задачи

Практическое руководство. Добавление данных в буфер обмена

Практическое руководство. Извлечение данных из буфера обмена

Другие ресурсы

Операции перетаскивания и поддержка буфера обмена