Пошаговое руководство. Выполнение операции перетаскивания в 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); }
Заметка
Любые данные можно использовать в качестве параметра в методе
DoDragDrop
; В приведенном выше примере использовалось свойство Text элемента управления Button (а не жесткое кодирование значения или получение данных из набора данных), так как свойство было связано с расположением, перетаскиваемом из (элемент управления Button). Имейте в виду это, так как вы включаете операции перетаскивания в приложения на основе Windows.
Пока операция перетаскивания действует, можно обрабатывать событие QueryContinueDrag, которое "запрашивает разрешение" системы для продолжения операции перетаскивания. При обработке этого метода подходящим моментом является вызов методов, которые будут влиять на операцию перетаскивания, например, когда курсор наводится на элемент управления TreeView, происходит расширение TreeNode.
Удаление данных
После того как вы начали перетаскивать данные из расположения в Windows Form или элементе управления, вы, естественно, захотите удалить их где-то. Курсор изменится, когда он пересекает область формы или элемента управления, которая правильно настроена для удаления данных. Любую область в Windows Form или элементе управления можно сделать доступной для принятия перетаскиваемых данных, задав свойство AllowDrop и обрабатывая события DragEnter и DragDrop.
Выполнить удаление
Задайте для свойства AllowDrop значение true.
В событии
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.
В событии 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).
См. также
.NET Desktop feedback