GB3- DROP d'un texte sur la bonne ligne d'une ListBox

Rédigé par spheris Aucun commentaire
Classé dans : apprentisssage, gambas 3, Listbox, Tutoriel, Drag Mots clés : aucun

Bonjour,

Aujourd'hui je vous propose d'étudier un drag and drop sur une listbox

1- Problème posé

Je souhaite glisser déplacer un texte d'un label dans une listBox et je voudrais que le texte ainsi déplacé aille exactement sur la ligne que je pointe quand je lache la souris.

2- Création de lignes dans la listbox


Je créé les lignes à l'ouverture de ma Form comme ceci :

Public Sub Form_Open()
Dim a As Integer
For a = 0 To 149
    cv.Add("text: " & a, a)
Next
End


Un petit bouton QUIT pour quitter mon exemple :

Public Sub bquit_Click()
Me.Close()
End

3- Le DRAG de mon texte

pour ce glisser déplacer, je vais utiliser un Label nommé Label1 :

Public Sub Label1_MouseDrag()
Last.Drag(Label1.Text)
End


4- Le drop sur ma ListBox nommée cv

Voici le code pour le DROP de mon label :

Public Sub cv_Drop()
  Dim gv As Gridview = cv.FindChild(Drag.X, Drag.Y)
  Dim iIndex As Integer = gv.RowAt(Drag.Y)
cv[iIndex].Text = Trim(Drag.Paste("text/plain"))
End


Détaillons ce code :

Dim gv As Gridview = cv.FindChild(Drag.X, Drag.Y) :

Je créé un objet gv qui est une gridview  et je dis que cet objet gridview est égal au résultat de la méthode FindChild. pourquoi ?
Car il faut savoir que la listbox hérite d'une gridview, donc elle a le même comportement et les mêmes propriétés.
Je passe en paramètre de FindChild les coordonnées du glissé/déplacé par Drag.X et Drag.Y

Dim iIndex As Integer = gv.RowAt(Drag.Y):
Je crée une variable iIndex qui récupère l'index de la ligne ainsi pointée par Drag.Y

cv[iIndex].Text = Trim(Drag.Paste("text/plain")):
Il ne me reste plus qu'à copier le texte au bon endroit c'est à dire:
cv[index trouvé].text.

CONCLUSION:

Je vous avoue que je n'aurais pas trouvé sans l'aide de Bruce, un expert de l'équipe de développeurs gambas.
Merci pour son aide.

Voici le code complet de l'exemple :

Public Sub Form_Open()
Dim a As Integer
For a = 0 To 149
    cv.Add("text: " & a, a)
Next
End

Public Sub bquit_Click()
Me.Close()
End

Public Sub Label1_MouseDrag()
Last.Drag(Label1.Text)
End

Public Sub cv_Drop()
  Dim gv As Gridview = cv.FindChild(Drag.X, Drag.Y)
  Dim iIndex As Integer = gv.RowAt(Drag.Y)
cv[iIndex].Text = Trim(Drag.Paste("text/plain"))
End