Reordenar Items de ListView Con arrastrar y soltar

Escrito en Enero 12, 2009 por Alex

El control ListView de Visual Basic.Net no tiene ningún método que nos ayude a reordenar los Items que no sea de una manera alfabética con solo arrastrar y soltar un elemento.

Necesitamos insertar el ListView que en este ejemplo lleva en su propiedad Name o Nombre: List1, la propiedad View la ponemos en Details, le agregamos una columna con el nombre que deseen y en el evento Load del formulario le agregamos algunos Items de prueba:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Items de prueba
        Me.List1.Items.Add("Janet")
        Me.List1.Items.Add("Jose")
        Me.List1.Items.Add("Hugo")
        Me.List1.Items.Add("Luis")
        Me.List1.Items.Add("Alberto")
        Me.List1.Items.Add("Carlos")
        Me.List1.Items.Add("Jorge")
        Me.List1.Items.Add("isabel")
        Me.List1.Items.Add("karla")
        Me.List1.Items.Add("Gaby")
    End Sub

Para lograr ordenar los Items con el ratón, vamos a codificar tres de su eventos:

DragDrop: Evento que ocurre cuando se completa una operación de arrastrar y soltar.
DragEnter: Se produce cuando se arrastra un elemento en el área cliente.
 ItemDrag: Se produce cuando el usuario comienza a arrastrar un elemento.

Dentro del evento DragEnter colocamos este código:

 'cuando se arrastra un elemento al area cliente
        'provocamos el efecto de moviemiento
        Dim i As Integer
        For i = 0 To e.Data.GetFormats().Length - 1
            If e.Data.GetFormats()(i).Equals("System.Windows.Forms.ListView+SelectedListViewItemCollection") Then
                e.Effect = DragDropEffects.Move
            End If
        Next

Dentro del evento ItemDrag ponemos el código siguiente:

  'Efecto movimiento con ayuda del evento DragEnter
        List1.DoDragDrop(List1.SelectedItems, DragDropEffects.Move)

Dentro del evento DragDrop metemos el siguiente código:

'Cuando se completa la operación de4 arrastrar y soltar
 
        'Si los Items no estan seleccionados Sale del Sub
        If List1.SelectedItems.Count = 0 Then Exit Sub
        'Tomamos la ubicación del puntero del ratón en el control.
        Dim p As Point = List1.PointToClient(New Point(e.X, e.Y))
        'Leemos el item donde se ubica el ratón
        Dim dragToItem As ListViewItem = List1.GetItemAt(p.X, p.Y)
        If dragToItem Is Nothing Then Return
        'Tomamos el Index del Item y recorremos todos los items
        Dim dragIndex As Integer = dragToItem.Index
        Dim i As Integer
        Dim sel(List1.SelectedItems.Count) As ListViewItem
        For i = 0 To List1.SelectedItems.Count - 1
            sel(i) = List1.SelectedItems.Item(i)
        Next
        For i = 0 To List1.SelectedItems.Count - 1
            'Arrastramos a la ubicación de destino.
            Dim dragItem As ListViewItem = sel(i)
            Dim itemIndex As Integer = dragIndex
            If itemIndex = dragItem.Index Then Return
            If dragItem.Index < itemIndex Then
                itemIndex = itemIndex + 1
            Else
                itemIndex = dragIndex + i
            End If
            'Lo insertamos.
            Dim insertitem As ListViewItem = CType(dragItem.Clone, ListViewItem)
            List1.Items.Insert(itemIndex, insertitem)
            'Borramos el Item de su ubicación original
            'Lo movemos a su nueva ubicación.
            List1.Items.Remove(dragItem)
        Next
        'Por ultimo refrecamos el List para reasignar indices
        List1.Refresh()

Generamos el proyecto y lo ejecutamos para ver resultados.

Si te gusto este artículo Suscribete a nuestro feed

Escribe un comentario