none
mover filas de un listview RRS feed

  • Pregunta

  • hola

    Bueno mi problemita es que tengo un listview que tengo que mover las filas con dos botones, uno es para subir y otro para bajar la fila seleccionada, pero el tema esta en como hago para mover las filas por codigo

    sábado, 1 de octubre de 2011 1:08

Respuestas

  • "10Gox" preguntó:

    > tengo un listview que tengo que mover las filas con dos botones, uno
    > es para subir y otro para bajar la fila seleccionada, pero el tema
    > esta en como hago para mover las filas por codigo

    Hola:

    Todo consiste en mover el elemento anterior o posterior a aquel que actualmente se encuentra seleccionado en el control ListView.

    Mira a ver si te sirve el siguiente procedimiento:

        ''' <summary>
        ''' Mueve de posición el elemento actualmente seleccionado
        ''' </summary>
        ''' <author>Enrique Martínez Montejo - 2011</author>
        ''' <param name="lv">Control ListView.</param>
        ''' <param name="down">True para mover el elemento hacia abajo;
        ''' False para moverlo hacia arriba.</param>
        ''' <remarks></remarks>
        Public Sub MoveItem(lv As ListView, down As Boolean)
    
            ' Si no hay elementos seleccionados, abandonamos
            ' el procedimiento.
            If (lv.SelectedItems.Count = 0) Then Return
    
            ' Obtenemos el índice del primer elemento seleccionado,
            ' que será el que cambie de posición.
            Dim selectedIndex As Integer = lv.SelectedItems(0).Index
    
            Try
                ' Número total de elementos existentes en el control ListView
                Dim count As Integer = lv.Items.Count
    
                ' Verificamos si se puede mover el elemento actualmente seleccionado.
                If ((down) AndAlso (selectedIndex = count - 1)) Then
                    ' Es el último elemento
                    Return
    
                ElseIf ((Not (down)) AndAlso (selectedIndex = 0)) Then
                    ' Es el primer elemento
                    Return
    
                End If
    
                Dim item As ListViewItem = Nothing
    
                If (down) Then
                    ' Referenciamos el siguiente elemento
                    item = lv.Items(selectedIndex + 1)
    
                Else
                    ' Referenciamos el elemento anterior
                    item = lv.Items(selectedIndex - 1)
    
                End If
    
                ' Obtenemos el índice del elemento que
                ' va a cambiar de posición.
                Dim newIndex As Integer = item.Index
    
                ' Eliminamos el elemento de su posición ...
                lv.Items.RemoveAt(item.Index)
    
                ' ... y lo insertamos en la posición del
                ' elemento actualmente seleccionado.
                lv.Items.Insert(selectedIndex, item)
    
            Finally
                ' Pasamos de nuevo el foco al control ListView
                lv.Focus()
    
            End Try
    
        End Sub
    

    Cuando desees mover un elemento hacia abajo ejecutarías:
        MoveItem(ListView1, True)
    

    Y cuando desees moverlo hacia arriba: 
        MoveItem(ListView1, False)
    

    Si ves que es "muy largo" el procedimiento, elimina los comentarios (los cuales no se compilan), pero los he incluido para que no te limites a "copiar/pegar" y conozcas cual es el cometido de cada línea de código. ;-)  

    Al método se le pasa un objeto Listview para que pueda ser utilizado tanto para un control ListView llamado ListView1 como para otro llamado ListView2. Por éste motivo, y siempre y cuando estés utilizando Visual Basic 2008 o superior, el método te podría servir para "EXTENDER" el control ListView, proporcionándole un nuevo método llamado "MoveItem".

    Así, en un módulo insertarías el contenido del método: 

    Imports System.Runtime.CompilerServices
    
    Module ListViewExtended
    
        <Extension()> _
        Public Sub MoveItem(lv As ListView, down As Boolean)
    
           ' Insertar aquí el código del método
    
        End Sub
    
    End Module
    


    Y desde los eventos Click de los controles Button llamarías al método 'MoveItem' como si fuera un método más del control ListView:

       ListView1.MoveItem(True)
       ListView1.MoveItem(False)
    

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    domingo, 2 de octubre de 2011 9:27
    Moderador
  • podria ser algo como esto

     

    Private Sub Form1_Load(sender As Object, e As EventArgs)
    	
            Dim lista As New Dictionary(Of Integer, String)() With { _
    		{1, "Andres"}, _
    		{2, "Miguel"}, _
    		{3, "Antonio"} _
    	}
    
    	For Each item As KeyValuePair(Of Integer, String) In lista
    		Dim itemListView As New ListViewItem(item.Key.ToString())
    		itemListView.SubItems.Add(item.Value)
    
    		listView1.Items.Add(itemListView)
    	Next
    End Sub
    
    
    Private Sub btnArriba_Click(sender As Object, e As EventArgs)
    	Dim item As ListViewItem = listView1.SelectedItems(0)
    
    	If item.Index = 0 Then
    		Return
    	End If
    
    	Dim pos As Integer = item.Index - 1
    
    	listView1.Items.RemoveAt(item.Index)
    
    	listView1.Items.Insert(pos, item)
    
    	listView1.Focus()
    	listView1.Items(pos).Selected = True
    
    End Sub
    
    Private Sub btnAbajo_Click(sender As Object, e As EventArgs)
    	Dim item As ListViewItem = listView1.SelectedItems(0)
    
    	If item.Index = (listView1.Items.Count - 1) Then
    		Return
    	End If
    
    	Dim pos As Integer = item.Index + 1
    
    	listView1.Items.RemoveAt(item.Index)
    
    	listView1.Items.Insert(pos, item)
    
    	listView1.Focus()
    	listView1.Items(pos).Selected = True
    End Sub
    



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta 10Gox domingo, 2 de octubre de 2011 20:31
    sábado, 1 de octubre de 2011 4:41
  • te paso una version mejorada

     

    Private Sub btnArriba_Click(sender As Object, e As EventArgs)
    
    	MoverSeleccion(Function(index) index = 0, Function(index) index - 1)
    
    End Sub
    
    Private Sub btnAbajo_Click(sender As Object, e As EventArgs)
    
    	MoverSeleccion(Function(index) index = (listView1.Items.Count - 1), Function(index) index + 1)
    
    End Sub
    
    
    Private Sub MoverSeleccion(validacion As Func(Of Integer, Boolean), operacion As Func(Of Integer, Integer))
    	Dim item As ListViewItem = listView1.SelectedItems(0)
    
    	If validacion(item.Index) Then
    		Return
    	End If
    
    	Dim pos As Integer = operacion(item.Index)
    
    	listView1.Items.RemoveAt(item.Index)
    
    	listView1.Items.Insert(pos, item)
    
    	listView1.Focus()
    	listView1.Items(pos).Selected = True
    End Sub
    


    como veras esta version usa lambda y Func para definir delagados

    por supuesto esta ultima version es mas optima que la anterior


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta 10Gox domingo, 2 de octubre de 2011 20:31
    sábado, 1 de octubre de 2011 4:53

Todas las respuestas

  • podria ser algo como esto

     

    Private Sub Form1_Load(sender As Object, e As EventArgs)
    	
            Dim lista As New Dictionary(Of Integer, String)() With { _
    		{1, "Andres"}, _
    		{2, "Miguel"}, _
    		{3, "Antonio"} _
    	}
    
    	For Each item As KeyValuePair(Of Integer, String) In lista
    		Dim itemListView As New ListViewItem(item.Key.ToString())
    		itemListView.SubItems.Add(item.Value)
    
    		listView1.Items.Add(itemListView)
    	Next
    End Sub
    
    
    Private Sub btnArriba_Click(sender As Object, e As EventArgs)
    	Dim item As ListViewItem = listView1.SelectedItems(0)
    
    	If item.Index = 0 Then
    		Return
    	End If
    
    	Dim pos As Integer = item.Index - 1
    
    	listView1.Items.RemoveAt(item.Index)
    
    	listView1.Items.Insert(pos, item)
    
    	listView1.Focus()
    	listView1.Items(pos).Selected = True
    
    End Sub
    
    Private Sub btnAbajo_Click(sender As Object, e As EventArgs)
    	Dim item As ListViewItem = listView1.SelectedItems(0)
    
    	If item.Index = (listView1.Items.Count - 1) Then
    		Return
    	End If
    
    	Dim pos As Integer = item.Index + 1
    
    	listView1.Items.RemoveAt(item.Index)
    
    	listView1.Items.Insert(pos, item)
    
    	listView1.Focus()
    	listView1.Items(pos).Selected = True
    End Sub
    



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta 10Gox domingo, 2 de octubre de 2011 20:31
    sábado, 1 de octubre de 2011 4:41
  • te paso una version mejorada

     

    Private Sub btnArriba_Click(sender As Object, e As EventArgs)
    
    	MoverSeleccion(Function(index) index = 0, Function(index) index - 1)
    
    End Sub
    
    Private Sub btnAbajo_Click(sender As Object, e As EventArgs)
    
    	MoverSeleccion(Function(index) index = (listView1.Items.Count - 1), Function(index) index + 1)
    
    End Sub
    
    
    Private Sub MoverSeleccion(validacion As Func(Of Integer, Boolean), operacion As Func(Of Integer, Integer))
    	Dim item As ListViewItem = listView1.SelectedItems(0)
    
    	If validacion(item.Index) Then
    		Return
    	End If
    
    	Dim pos As Integer = operacion(item.Index)
    
    	listView1.Items.RemoveAt(item.Index)
    
    	listView1.Items.Insert(pos, item)
    
    	listView1.Focus()
    	listView1.Items(pos).Selected = True
    End Sub
    


    como veras esta version usa lambda y Func para definir delagados

    por supuesto esta ultima version es mas optima que la anterior


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta 10Gox domingo, 2 de octubre de 2011 20:31
    sábado, 1 de octubre de 2011 4:53
  • "10Gox" preguntó:

    > tengo un listview que tengo que mover las filas con dos botones, uno
    > es para subir y otro para bajar la fila seleccionada, pero el tema
    > esta en como hago para mover las filas por codigo

    Hola:

    Todo consiste en mover el elemento anterior o posterior a aquel que actualmente se encuentra seleccionado en el control ListView.

    Mira a ver si te sirve el siguiente procedimiento:

        ''' <summary>
        ''' Mueve de posición el elemento actualmente seleccionado
        ''' </summary>
        ''' <author>Enrique Martínez Montejo - 2011</author>
        ''' <param name="lv">Control ListView.</param>
        ''' <param name="down">True para mover el elemento hacia abajo;
        ''' False para moverlo hacia arriba.</param>
        ''' <remarks></remarks>
        Public Sub MoveItem(lv As ListView, down As Boolean)
    
            ' Si no hay elementos seleccionados, abandonamos
            ' el procedimiento.
            If (lv.SelectedItems.Count = 0) Then Return
    
            ' Obtenemos el índice del primer elemento seleccionado,
            ' que será el que cambie de posición.
            Dim selectedIndex As Integer = lv.SelectedItems(0).Index
    
            Try
                ' Número total de elementos existentes en el control ListView
                Dim count As Integer = lv.Items.Count
    
                ' Verificamos si se puede mover el elemento actualmente seleccionado.
                If ((down) AndAlso (selectedIndex = count - 1)) Then
                    ' Es el último elemento
                    Return
    
                ElseIf ((Not (down)) AndAlso (selectedIndex = 0)) Then
                    ' Es el primer elemento
                    Return
    
                End If
    
                Dim item As ListViewItem = Nothing
    
                If (down) Then
                    ' Referenciamos el siguiente elemento
                    item = lv.Items(selectedIndex + 1)
    
                Else
                    ' Referenciamos el elemento anterior
                    item = lv.Items(selectedIndex - 1)
    
                End If
    
                ' Obtenemos el índice del elemento que
                ' va a cambiar de posición.
                Dim newIndex As Integer = item.Index
    
                ' Eliminamos el elemento de su posición ...
                lv.Items.RemoveAt(item.Index)
    
                ' ... y lo insertamos en la posición del
                ' elemento actualmente seleccionado.
                lv.Items.Insert(selectedIndex, item)
    
            Finally
                ' Pasamos de nuevo el foco al control ListView
                lv.Focus()
    
            End Try
    
        End Sub
    

    Cuando desees mover un elemento hacia abajo ejecutarías:
        MoveItem(ListView1, True)
    

    Y cuando desees moverlo hacia arriba: 
        MoveItem(ListView1, False)
    

    Si ves que es "muy largo" el procedimiento, elimina los comentarios (los cuales no se compilan), pero los he incluido para que no te limites a "copiar/pegar" y conozcas cual es el cometido de cada línea de código. ;-)  

    Al método se le pasa un objeto Listview para que pueda ser utilizado tanto para un control ListView llamado ListView1 como para otro llamado ListView2. Por éste motivo, y siempre y cuando estés utilizando Visual Basic 2008 o superior, el método te podría servir para "EXTENDER" el control ListView, proporcionándole un nuevo método llamado "MoveItem".

    Así, en un módulo insertarías el contenido del método: 

    Imports System.Runtime.CompilerServices
    
    Module ListViewExtended
    
        <Extension()> _
        Public Sub MoveItem(lv As ListView, down As Boolean)
    
           ' Insertar aquí el código del método
    
        End Sub
    
    End Module
    


    Y desde los eventos Click de los controles Button llamarías al método 'MoveItem' como si fuera un método más del control ListView:

       ListView1.MoveItem(True)
       ListView1.MoveItem(False)
    

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    domingo, 2 de octubre de 2011 9:27
    Moderador
  • Por personas como tú es que Goku dio su vida para salvarnos... :D
    martes, 11 de julio de 2017 14:42