Hit-Parade .VB Research Center . Compteur
Accueil ~  Code ~  Programmes ~  Api ~  Forum ~  Cours ~  Livres ~  Quiz ~  Annuaire
~ Edito ~
12/03/2006 @ 13:39
Depuis la dernière mise à jour (qui remonte à... oulala plusieurs mois), un petit ménage de printemps s'impose. Ca tombe bien, c'est presque la période.
Au menu, et progressivement sur les jours à venir, rafraîchissement de plusieurs fonctions et procédures, nouvelles APIs et nouveaux programmes.

~ Rechercher ~

  

~ Annuaire VB ~
 Rechercher un site :
  

~ Partenaires ~

Divers : Echange de liste
Cet article explique la mise en place d'un système d'échange de contenu entre deux listes (ListBox).
(Consulté 21310 fois.)

Initialisation des contrôles

L'objectif ici est de permettre de faire passer librement le contenu d'une liste vers une autre. On peut faire passer, un, plusieurs ou tous les éléments, et de la même manière les faire revenir.
Pour cette démonstration 2 contrôles ListBox et quatre boutons sont utilisés (les boutons sont facultatifs).

Sélection des éléments

Le seul point important à vérifier lors de la mise en place du code d'échange est que les deux listes doivent avoir leur propriété MultiSelect à 2 (extended). Les boutons permettent de faire passer les éléments d'une liste à l'autre. On peut cependant associer par défaut l'évènement Click des contrôles ListBox au passage de l'élément courant vers l'autre liste (ce qui est fait ici).

Résultat de l'échange

Lors du passage d'un élément d'une liste vers l'autre, la valeur de la propriété ItemData est conservée. Enfin, chaque élément est ajouté en fin de liste. Ainsi, une valeur qui fait un aller/retour se retrouvera en fin de sa liste de départ.

Le principe de l'échange utilise 2 fonctions :
Echange(lstSource As ListBox, lstDestination As ListBox)
~ Cette procédure prend les valeurs sélectionnée (en surbrillance) d'une liste source et les ajoute à la liste destination (les valeurs sont supprimées de la source).
EchangeTout(lstSource As ListBox, lstDestination As ListBox)
~ Cette procédure prend toutes les valeurs d'une liste source et les place dans la liste destination. A la fin de l'opération, la liste source est donc vide.

Cliquez ici pour télécharger la feuille complète

Option Explicit

Private Sub
Form_Load()
' Chargement de la feuille - Initialisation des valeurs
lstDispo.Clear
lstExport.Clear
lstDispo.AddItem "Répertoire"
lstDispo.ItemData(lstDispo.NewIndex) = 1
lstDispo.AddItem "Fichier"
lstDispo.ItemData(lstDispo.NewIndex) = 2
lstDispo.AddItem "Titre"
lstDispo.ItemData(lstDispo.NewIndex) = 3
lstDispo.AddItem "Artiste"
lstDispo.ItemData(lstDispo.NewIndex) = 4
lstDispo.AddItem "Album"
lstDispo.ItemData(lstDispo.NewIndex) = 5
lstDispo.AddItem "Année"
lstDispo.ItemData(lstDispo.NewIndex) = 6
lstDispo.AddItem "Genre"
lstDispo.ItemData(lstDispo.NewIndex) = 7
lstDispo.AddItem "Commentaire"
lstDispo.ItemData(lstDispo.NewIndex) = 8
lstDispo.AddItem "Taille"
lstDispo.ItemData(lstDispo.NewIndex) = 9
lstDispo.AddItem "Durée"
lstDispo.ItemData(lstDispo.NewIndex) = 10
lstDispo.AddItem "Kbps"
lstDispo.ItemData(lstDispo.NewIndex) = 11
lstDispo.AddItem "Mode"
lstDispo.ItemData(lstDispo.NewIndex) = 12
End Sub

' Evènements des listes et boutons d'échanges

Private Sub lstDispo_DblClick()
Call cmdAdd_Click
End Sub

Private Sub
lstExport_DblClick()
Call cmdDel_Click
End Sub

Private Sub
cmdAdd_Click()
Call Echange(lstDispo, lstExport)
End Sub

Private Sub
cmdAddAll_Click()
Call EchangeTout(lstDispo, lstExport)
End Sub

Private Sub
cmdDel_Click()
Call Echange(lstExport, lstDispo)
End Sub

Private Sub
cmdDelAll_Click()
Call EchangeTout(lstExport, lstDispo)
End Sub

' Fonctions d'échange de liste

Public Sub Echange(lstSource As ListBox, lstDestination As ListBox)
' Ajout d'un élément de la liste Source vers la liste Destination
Dim lgTmp As Long
If (
lstSource.ListCount > 0) Then
    If (
lstSource.ListIndex > -1) Then
       
lgTmp = lstSource.ListIndex
        lstDestination.AddItem lstSource.List(lgTmp)
        lstDestination.ItemData(lstDestination.NewIndex) = _
                                lstSource.ItemData(lgTmp)
        lstSource.RemoveItem lgTmp
   
End If
End If
lstSource.SetFocus
If (lstSource.ListCount > lgTmp) Then
   
lstSource.ListIndex = lgTmp
ElseIf (lstSource.ListCount > 0) Then
   
lstSource.ListIndex = lstSource.ListCount - 1
End If
If (
lstSource.SelCount > 0) Then
    For
lgTmp = 0 To lstSource.ListCount - 1
       
If lstSource.Selected(lgTmp) Then
           
lstSource.ListIndex = lgTmp
           
Exit For
        End If
    Next
lgTmp
   
Call Echange(lstSource, lstDestination)
End If
End Sub

Public Sub
EchangeTout(lstSource As ListBox, lstDestination As ListBox)
' Ajout de tous les éléments de la liste Source vers la liste Destination
Dim lgTmp As Long
For
lgTmp = 1 To lstSource.ListCount
    lstSource.ListIndex = 0
    lstDestination.AddItem lstSource.List(lstSource.ListIndex)
    lstDestination.ItemData(lstDestination.NewIndex) = _
                   lstSource.ItemData(lstSource.ListIndex)
    lstSource.RemoveItem lstSource.ListIndex
Next lgTmp
End Sub
Visual Basic Research Center - (c) 2000/2002 -  Webmaster : docvb (chez) free (point) fr