N'ayant rien trouvé sur le net pour déplacé plus d'un item en up/down dans un ListBox/ListView.
Je me suis basé sur une fonction up/down et l'ai adapté pour le MultiSelect.
Dans la mesure ou j'allais l'utiliser avec un ListView, j'ai tout adapté pour un ListView.
Source / Exemple :
Private Sub MoveDownItem(ByRef List As ListView)
Dim i, j As Integer
Dim Cache As String
Dim SelIdx As Integer
Dim LstCount As Integer = List.SelectedItems.Count - 1
Dim rSelIdx(LstCount, 0) As String
i = LstCount
'On récupère tous les id dans un tableau pour les traités dans l'ordre inverse (du dernier au premier)
For Each SelItem As ListViewItem In List.SelectedItems
rSelIdx(i, 0) = CStr(CInt(SelItem.Index))
i -= 1
Next
For j = 0 To LstCount
SelIdx = CInt(rSelIdx(j, 0))
'Si on ne sait pas/plus le descendre on s'arrête
If SelIdx = List.Items.Count - 1 Then
List.Refresh()
List.Focus()
Exit Sub
End If
'On inverse l'item/le subitem du dessous par celui du dessus
For i = 0 To List.Items(SelIdx).SubItems.Count - 1
Cache = List.Items(SelIdx + 1).SubItems(i).Text
List.Items(SelIdx + 1).SubItems(i).Text = List.Items(SelIdx).SubItems(i).Text
List.Items(SelIdx).SubItems(i).Text = Cache
Next
'On inverse la sélection
List.Items(SelIdx + 1).Selected = True
List.Items(SelIdx).Selected = False
Next
List.Refresh()
List.Focus()
End Sub
Private Sub MoveUpItem(ByRef List As ListView)
Dim i As Integer
Dim Cache As String
Dim SelIdx As Integer
'On traite tous les items sélectionné
For Each SelItem As ListViewItem In List.SelectedItems
'On récupère l'id de l'item en cours de traitement
SelIdx = SelItem.Index
'Si on ne sait pas/plus le monter on s'arrête
If SelIdx = 0 Then
List.Refresh()
List.Focus()
Exit Sub
End If
'On inverse l'item/le subitem du dessus par celui du dessous
For i = 0 To List.Items(SelIdx).SubItems.Count - 1
Cache = List.Items(SelIdx - 1).SubItems(i).Text
List.Items(SelIdx - 1).SubItems(i).Text = List.Items(SelIdx).SubItems(i).Text
List.Items(SelIdx).SubItems(i).Text = Cache
Next
'On inverse la sélection
List.Items(SelIdx - 1).Selected = True
List.Items(SelIdx).Selected = False
Next
'On refresh et on rend le focus
List.Refresh()
List.Focus()
End Sub
Private Sub MoveTopItem(ByRef List As ListView)
Dim i As Integer
Dim Cache As String
Dim SelIdx As Integer
Dim TopDiff As Integer = List.SelectedItems(0).Index
Dim k As Integer = 1
'On traite tous les items sélectionné
For Each SelItem As ListViewItem In List.SelectedItems
'On récupère l'id de l'item en cours de traitement
SelIdx = SelItem.Index
'Si on ne sait pas/plus le monter on s'arrête
If SelIdx = 0 Then
List.Refresh()
List.Focus()
Exit Sub
End If
k += 1
'On inverse l'item/le subitem du dessus par celui du dessous
For i = 0 To List.Items(SelIdx).SubItems.Count - 1
Cache = List.Items(SelIdx - TopDiff).SubItems(i).Text
List.Items(SelIdx - TopDiff).SubItems(i).Text = List.Items(SelIdx).SubItems(i).Text
'On descend tous les items au-dessus de l'item en cours de traitement
For j As Integer = SelIdx To k Step -1
List.Items(j).SubItems(i).Text = List.Items(j - 1).SubItems(i).Text
Next
List.Items(SelIdx - TopDiff + 1).SubItems(i).Text = Cache
Next
'On inverse la sélection
List.Items(SelIdx - TopDiff).Selected = True
List.Items(SelIdx).Selected = False
Next
List.Refresh()
List.Focus()
End Sub
Private Sub MoveBottomItem(ByRef List As ListView)
Dim i, j As Integer
Dim Cache As String
Dim SelIdx As Integer
Dim LstCount As Integer = List.Items.Count
Dim LstSelCount As Integer = List.SelectedItems.Count - 1
Dim rSelIdx(LstSelCount, 0) As String
Dim BottDiff As Integer = List.SelectedItems(List.SelectedItems.Count - 1).Index
Dim k As Integer = 0
i = LstSelCount
'On récupère tous les id dans un tableau pour les traités dans l'ordre inverse (du dernier au premier)
For Each SelItem As ListViewItem In List.SelectedItems
rSelIdx(i, 0) = CStr(CInt(SelItem.Index))
i -= 1
Next
For j = 0 To LstSelCount
SelIdx = CInt(rSelIdx(j, 0))
'Si on ne sait pas/plus le descendre on s'arrête
If SelIdx = List.Items.Count - 1 Then
List.Refresh()
List.Focus()
Exit Sub
End If
k += 1
'On inverse l'item/le subitem du dessous par celui du dessus
For i = 0 To List.Items(SelIdx).SubItems.Count - 1
Cache = List.Items(LstCount - k).SubItems(i).Text
List.Items(LstCount - k).SubItems(i).Text = List.Items(SelIdx).SubItems(i).Text
'On remonte tous les items en dessous de l'item en cours de traitement
For l As Integer = SelIdx To LstCount - (k + 1)
List.Items(l).SubItems(i).Text = List.Items(l + 1).SubItems(i).Text
Next
List.Items(LstCount - (k + 1)).SubItems(i).Text = Cache
Next
'On inverse la sélection
List.Items(List.Items.Count - k).Selected = True
List.Items(SelIdx).Selected = False
Next
List.Refresh()
List.Focus()
End Sub
Conclusion :
Il y a surement moyen de faire plus simple ou d'allégé le code mais tout fonctionne sous VB 2010.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.