Site:  Cours VB.net  
4.15 Drag and Drop.

L'exécution d'opérations glisser-déplacer  (Drag ans Drop) peut être ajoutée dans un programme.

La méthode DoDragDrop du contrôle de départ autorise la collecte des données au début de l'opération.

Les évènement  DragEnter, DragLeave et DragDrop. permettent de 'poser' les données dans le contrôle d'arrivée.

Exemple No 1 (simple)

Exemple: Le contrôle de départ est un contrôle Button, les données à faire glisser sont la chaîne représentant la propriété Text du contrôle Button, et les effets autorisés sont la copie ou le déplacement. Le texte sera déposé dans un textBox:

Le contrôle de départ.

La fonctionnalité qui autorise la collecte des données au début de l'opération glisser dans la méthode DoDragDrop.

L'événement MouseDown du contrôle de départ est généralement utilisé pour démarrer l'opération glisser parce qu'il est le plus intuitif (la plupart des glisser-déplacer commencent par un appuie sur le  bouton de la souris). Mais, souvenez-vous que n'importe quel événement peut servir à initialiser une procédure glisser-déplacer.

Remarque   Les contrôles ListView et TreeView, , ont un événement ItemDrag qui est spécifique .


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

Le premier argument indique les données à déplacer.

Le second les effets permis = copier ou déplacer.

Le contrôle d'arrivée

Toute zone d'un Windows Form ou d'un contrôle peut être configurée pour accepter les données déplacées en définissant la propriété AllowDrop et en gérant les événements DragEnter et DragDrop.

Dans notre exemple, c'est un contrôle TextBox1 qui est le contrôle d'arrivée.

TextBox1.AllowDrop  =True.     'autorise le contrôle TextBox à recevoir

Dans l'événement DragEnter du contrôle qui doit recevoir les données déplacées

Vérifier que le type des données est compatible avec le contrôle d'arrivée (ici, vérifier que c'est bien du texte).

Définir ensuite l'effet produit lorsque le déplacement a lieu en lui attribuant une valeur de l'énumération DragDropEffects.(ici il faut copier)


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

Dans l'événement DragDrop du contrôle d'arrivée, utilisez la méthode GetData pour extraire les données que vous faites glisser.


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

Exemple No 2 plus complexe:
Glisser déplacer une ligne d'une listBox 'ListBox1' vers une listBox 'ListBox2'.
Créer une ListBox1
Créer une listBox2 avec sa propriété AllowDrop=True 'listBox2 accepte le 'lâcher'
Dans l'en-tête du module ajouter:

Public IndexdInsertion As Integer    ' Variable contenant l'index ou sera inséré la ligne

'Eventuellement pour l'exemple charger les 2 ListBox avec des chiffres pour pouvoir tester.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase

Dim i As Integer

For i = 1 To 100

ListBox1.Items.Add(i.ToString)

Next

For i = 1 To 100

ListBox2.Items.Add(i.ToString)

Next

End Sub

'Dans le listBox de départ, l'évènement MouseDown  déclenche le glisser déplacer par DoDragDrop.

Private Sub ListBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown

ListBox1.DoDragDrop(ListBox1.Items(ListBox1.IndexFromPoint(e.X, e.Y)), DragDropEffects.Copy Or DragDropEffects.Move)

End Sub

'ListBox1.IndexFromPoint(e.X, e.Y) retourne l'Index de l'item ou se trouve la souris à partir des coordonnées e.x et e.y du pointeur)

'DoDragDrop a 2 arguments: l'élément à draguer et le mode

 

'DragOver qui survient quand la souris se balade sur le contrôle d'arrivé, vérifie si le Drop reçoit bien du texte et met dans IndexdInsertion le listItem  qui est sous la souris.

'Noter que e.x et e.y sont les coordonnées écran , il faut les transformer en coordonnées client (du contrôle) par PointToClient afin d'obtenir l'index de l'item ou se trouve la souris (en utilisant IndexFromPoint.

Private Sub ListBox2_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragOver

If Not (e.Data.GetDataPresent(GetType(System.String))) Then

e.Effect = DragDropEffects.None

Else

IndexdInsertion = ListBox2.IndexFromPoint(ListBox2.PointToClient(New Point(e.X, e.Y)))

e.Effect = DragDropEffects.Copy

End If

End Sub

 

'Enfin dans DragDrop, on récupère le texte dans Item et on ajoute un item après l'item pointé.

Private Sub ListBox2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragDrop

Dim item As Object = CType(e.Data.GetData(GetType(System.String)), System.Object)

ListBox2.Items.Insert(IndexdInsertion + 1, item)

End Sub