Metodo para ordenar un ListView

06/12/2005 - 00:40 por final | Informe spam
Este metodo es para subir y bajar los items mediante dos botones arriba y
abajo XDXD

Después de un rato de pelearme con cajitas (una forma física de hacer lo ke
haría con los items de la lista) diseñe (ke de seguro alguien mas ya lo
diseño -_- pero ke esperaban soy un aprendiz XD) el siguiente método para
hacerlo:

Supongamos ke los valores en el listView son los siguientes: (en realidad no
importa cuales sean pero bueno esto es solo un ejemplo)



+++

| INDICE | TEXTO |

+++

| 0 | ITEM0 |

+++

| 1 | ITEM1 |

+++

| 2 | ITEM2 |

+++

| 3 | ITEM3 |

+++

| 4 | ITEM4 |

+++

| 5 | ITEM5 |

+++

| 6 | ITEM6 |

+++

| 7 | ITEM7 |

+++

| 8 | ITEM8 |

+++

| 9 | ITEM9 |

+++

Bueno básicamente lo ke aremos será mover el valor ke keremos intercambiar y
el ke será intercambiado a cajas (variables yo como lo hice físico pues...)
y asignar los cambios a cada botón pero ke mejor ke el código para
explicarlo así ke en total el código kedaria así aparte si deseas ver como
funciona en http://mx.geocities.com/nma2040/Eje...stView.zip he
puesto el código fuente de la aplicación XD (confíen en mi no tiene virus
LOL)



'-Código Botón Subir--

Private Sub subir_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles subir.Click

If ListView1.FocusedItem.Index > 0 Then 'Revisamos ke no sea el
primero de la lista de lo contrario tendríamos error

'ya ke no habría un elemento arriba el
cual intercambiar XD

Dim CAJA_POSICION1 As Integer = ListView1.FocusedItem.Index
'Ahora meteremos en una "caja" el índice del elemento seleccionado por el
usuario (yo use la propiedad focusedItem ya ke con la propiedad
SelectedIndices me devolvía una colección y no supe ke hacer con ella -_-

Dim CAJA_POSICION2 As Integer = ListView1.FocusedItem.Index - 1
'en este caso como lo quiero mover a la posicion anterior disminui 1 al
índice del item seleccionado (guau ke sabiduría XDDDD)

Dim CAJA_ITEM1 As String = ListView1.Items(CAJA_POSICION1).Text
'Metemos el contenido del elemento seleccionado en una "caja"

Dim CAJA_ITEM2 As String = ListView1.Items(CAJA_POSICION2).Text
'hacemos lo mismo con el elemento de "arriba" es decir el ke tiene la
posición anterior

ListView1.Items.RemoveAt(CAJA_POSICION1) 'eliminamos el item
seleccionado

ListView1.Items.RemoveAt(CAJA_POSICION2) 'eliminamos el item
anterior

ListView1.Items.Insert(CAJA_POSICION2, CAJA_ITEM1) 'ahora
ponemos el item ke habíamos seleccionado en la posición del otro

ListView1.Items.Insert(CAJA_POSICION1, CAJA_ITEM2) 'y ponemos el
item ke estaba en esa posición en la posición original del item seleccionado
XDDDD

ListView1.Items(CAJA_POSICION2).Selected = True 'por ultimo
selecciono el item en su nueva posición

ListView1.Items(CAJA_POSICION2).Focused = True 'y le doy el foco
para ke si vuelvo a presionar el botón lo suba de nuevo XDDDD

Else

Button1.Enabled = False 'si el item seleccionado es el primero
le digo ke desactive el botón XD

End If

End Sub

'Código botón Bajar

Private Sub bajar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles bajar.Click

If ListView1.FocusedItem.Index < ListView1.Items.Count - 1 Then
'revisamos ke el item seleccionado no sea el ultimo

Dim CAJA_POSICION1 As Integer = ListView1.FocusedItem.Index
'Ahora meteremos en una "caja" el indice del elemento

Dim CAJA_POSICION2 As Integer = ListView1.FocusedItem.Index + 1
'en este caso como lo quiero mover a la posicion posterior aumente 1 al
indice del item seleccionado (guau ke sabiduria XDDDD)

Dim CAJA_ITEM1 As String = ListView1.Items(CAJA_POSICION1).Text
'Metemos el contenido del elemento seleccionado en una "caja"

Dim CAJA_ITEM2 As String = ListView1.Items(CAJA_POSICION2).Text
'hacemos lo mismo con el elemento de "abajo" es decir el ke tiene la
posicion posterior

ListView1.Items.RemoveAt(CAJA_POSICION2) 'aquí es donde hay un
pekeño cambio ya ke invertimos el orden en el ke se eliminan los items ya ke
si eliminamos primero el indice del item posterior pasa a ser el indice del
item seleccionado y pues aparte de ke si no lo hacemos así no funcionaria
bien si los items fueran el "8" y el "9" nos causaría un error ya ke no
existiría el item numero 9

ListView1.Items.RemoveAt(CAJA_POSICION1) 'hacemos lo mismo con
el seleccionado

ListView1.Items.Insert(CAJA_POSICION1, CAJA_ITEM2) 'aquí también
se hace de forma inversa ke el anterior por lo mismo ke ya explike

ListView1.Items.Insert(CAJA_POSICION2, CAJA_ITEM1) 'insertamos
el ultimo item...

ListView1.Items(CAJA_POSICION2).Selected = True 'lo marcamos
como seleccionado

ListView1.Items(CAJA_POSICION2).Focused = True 'lo marcamos como
en foco

Else

Button2.Enabled = False 'si el item seleccionado es el ultimo le
digo ke desactive el botón bajar XD

End If

End Sub

'-hacer ke los botones estén activados o no en caso de
ser el primero o el ultimo--

Private Sub ListView1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ListView1.Click

If ListView1.FocusedItem.Index >= ListView1.Items.Count - 1 Then 'el
elemento es el ultimo? ...

bajar.Enabled = False 'desactiva el botón ke baja los items

subir.Enabled = True 'activa el botón ke sube los items

ElseIf ListView1.FocusedItem.Index <= 0 Then 'si es el primero...

subir.Enabled = False 'desactiva el botón ke sube los items

bajar.Enabled = True 'activa el botón ke los baja

Else 'si es intermedio

subir.Enabled = True 'activa ambos botones

bajar.Enabled = True

End If

End Sub





En este caso utilice el evento click ke se activa cuando el usuario
selecciona un item con el Mouse (básicamente cuando el usuario hace clic en
el list pero bueno...) por ke los eventos SelectedIndexChanged y
ItemSelectionChanged me funcionan solo una ves después me causan el error:
Object reference not set to an instance of an object.

Si alguien sabe el porke de este error o como solucionarlo por favor dígame
ya ke el mecanismo ke elegí solo funciona cuando es seleccionado con el
Mouse y no funciona automáticamente cuando la selección es cambiada por
código es por eso ke "emule" desde el código de los botones...




Bueno espero ke esto le sea útil a alguien "legalmente" este método de
ordenación, cambiándolos de lugar con botones debería funcionar de esta
forma con todos los objetos derivados de ILIST, a menos ke Billy y su
equipo(sorry pero soy hibrido Linux, Windows ambos tienen lo suyo XD) no
hayan puesto el método insert en cada uno de ellos, de lo contrario habría
ke hacerlo a la antigüita moviendo todos a otro ILIST y ordenándolos pero
bueno... espero ke les sirva XD y pues ya saben aunke soy aprendiz estoy
dispuesto a ayudar a cualquiera siempre y cuando este dentro de mis
posibilidades y pues si pongo estos "descubrimientos" míos es para ke los
mas newbies y autodidactas como yo, solo me keda darles el siguiente
consejo: "no intenten reinventar la rueda siempre es mejor utilizar lo ke ya
existe" (Renato Haddad; curso .NET escencial) XDXD(por si alguno de esos
programadores experimentados que lo saben todo y nunca les faltan
algoritmos. kieren reclamar porque esta forma ya existe créanme antes de
hacer esta "solución" busque por todas partes y no encontré nada que hiciera
lo que keria -_-, y si ya existia. ¡porke no me avisaron antes de ponerme a
jugar con mis "cajitas"! mmm. sorry por ese comentario pero me he encontrado
con gente tan prepotente que. ustedes comprenden alguna ves fueron newbies.)



Nota Inservible: Alguna ves se han preguntado por ke el código de cualquier
compilador esta en Fuente Corrier o Currier New? esto es porke estas fuentes
son "MonoEspace" es decir todas las letras miden lo mismo facilitando su
lectura y el Formato del párrafo (ya saben las tabulaciones los espacios y
todo eso XD) XD no me pregunten por ke lo escribí solo se me ocurrió



ATT: Final XDXDXD

PD: Si se les ocurra alguna forma de hacer mas eficiente esta forma de
ordenación por favor díganmela XD ¿OK?



y como solucionar problemas XDXDXD-
 

Leer las respuestas

#1 Carlos Gómez
06/12/2005 - 10:01 | Informe spam
Dim CAJA_ITEM1 As String = ListView1.Items(CAJA_POSICION1).Text


Si pones esto:

Dim CAJA_ITEM1 As New ListViewItem
CAJA_ITEM1=ListView1.Items(CAJA_POSICION1)

y ahora vale para un listview con mas de una columna

(lo he puesto de memoria y lo mismo falta algo, pero lo importante es la
idea)

Preguntas similares