Listview fonction move up, down, top & bottom en multiselect

Contenu du snippet

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.

A voir également

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.