Ordenar Elementos en un control ListView

30/11/2005 - 23:07 por final | Informe spam
Hola soy nuevo programando en visual.net... el problema es este quiero tener
un listview en el que se muestren varios elementos... y mediante dos botones
estos puedan ser ordenados en la lista es decir seleccionamos el elemento 5
pulsamos un boton y este pasa a ser el 4 y el que era el cuatro pasa a ser
el cinco, podrian ayudarme y de paso explicarme porque aun no me keda claro
el concept de las Ilist Gracias
 

Leer las respuestas

#1 final
06/12/2005 - 00:35 | Informe spam
Bueno supongo ke nadie supo como contestar esta duda, pero... 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-

Preguntas similares