Al final lo he resuelto.
En este ejemplo ya funciona todo. Lo he dividido en dos formularios.
En el primero tiene cadenas ( los nombres de los autores ) y fechas. En el segundo formulario, ordena solo cadenas
Entre la propia naturaleza del control, los métodos de ordenación ( que es la madre del cordero ) y según lo que quieras ordenar,
se complica.
(14-03-2024, 18:59)Shordi escribió: Cita:
Conejudo. Yo no utilizo el sorted del GridView porque es excluyente, es decir sólo se puede ordenar por una columna
Al final lo hice sin sorted. Es que no acabo de
entender, "cuando" y "donde" puedo poner a True, su propiedad Sorted.
Me gusta más tu forma de ordenar por que haces más cosas, ordenas por distintos conceptos.
Para una ordenación simple (que no lo es), si se podría utilizar el método que uso o usar sorted.
(14-03-2024, 18:59)Shordi escribió: tienes el siguiente paso de ordenación por múltiples columnas.
Eso es lo interesante. Aunque me he liado un poco con tu código. ( Excuse me ).
A medida que vas haciendo el vídeo voy añadiendo el código, modificaciones propias.
Tu código es más extenso (es una clase), hace más cosas. Hay cosas que me funcionaban y otras no.
La ordenación. Tengo que repasar los ejemplos que estoy haciendo con tus videotutoriales
y encontrar el motivo de que no funcione algo.
Cuando de 300 registros creas 9000, ostras. Era mejor dejarlo solo con los 300 que es lo que trae
el csv y no complicarte, en ese caso no se puede usar el reloj, claro. Tira de procesador , un momento.
Tal como he acabado los dos ejemplos, funcionan ambos. Puede que no este optimizado del todo.
Me he valido de un array para indices, que se guarda en el, los cambios de orden de los registros.
Por otra parte no es lo mismo
ordenar cadenas que fechas. ( Te tienes que valer de algo más para ordenar fechas)
En los ejemplos que yo he visto de tus videotutoriales, trabajas con cadenas y números que son cadenas.
( Puede que no hayas visto el problema de lo que es trabajar con fechas ).
Te muestro dos códigos fuentes.
En el ordeno solo columnas con cadenas.
Código:
Public Sub OrdenarValores(Columna As Integer, modo As Boolean)
Dim i As Integer
Dim tcadenas As New String[]
Dim scadenas As New String[]
Dim testvalores As New String[][]
Dim aotro As String[][]
Dim fila As Integer
Dim aindices As New Integer[]
testvalores = nombres.Copy()
For i = 0 To testvalores.Max
tcadenas.Add(testvalores[columna])
Next
scadenas = tcadenas.Copy()
'Descendente es True y ascendente es False
If modo Then
scadenas.Sort(modo + gb.Natural).Reverse()
Else
scadenas.Sort(modo + gb.Natural)
Endif
For i = 0 To tcadenas.Max
aindices.Add(scadenas.Find(tcadenas))
Next
'Se han ordenado las cadenas y creado indices para ver los cambios de lugar
aotro = testvalores.Copy()
For fila = 0 To testvalores.Max
Swap testvalores[fila], aotro[aindices.Find(fila)]
Next
nombres.Clear
nombres = testvalores
grd.Clear()
End
Ahora el más complicado. Como existen fechas y sé que la columna 1 y la 2 son fechas uso una forma para
ordenar las fechas y otro para las cadenas o nombres de los autores.
Lo importante de todo es saber
cuál es el orden que se ha cambiado en los registros, cosa que queda
registrada en el array aindices. ( Eso en ambos ejemplos ).
Aquí se añade más código claro.
Código:
Public Sub OrdenarValores(Columna As Integer, modo As Boolean)
Dim i As Integer
Dim tfechas As New Date[]
Dim sfechas As New Date[]
Dim tcadenas As New String[]
Dim scadenas As New String[]
Dim testvalores As New String[][]
Dim fila As Integer
Dim aindices As New Integer[]
Dim aotro As New String[][]
testvalores = nombres.Copy()
If Columna = 1 Or Columna = 2 Then
'Se parecen a fechas. lSon las columnas donde hay fechas
For i = 0 To testvalores.Max
tfechas.Add(Date(testvalores[Columna]))
Next
sfechas = tfechas.Copy()
'Descendente es True y ascendente es False
If modo Then
sfechas.Sort(modo).Reverse()
Else
sfechas.Sort(modo)
Endif
For i = 0 To tfechas.Max
'En el array aindices se almacena los cambios de los lugares que ocupan ahora en el array sfecha ordenado
aindices.Add(sfechas.Find(tfechas))
Next
'Se han ordenado las fechas y creado indices para ver los cambios de lugar
Else If columna = 0 Then
'Es un texto
For i = 0 To testvalores.Max
tcadenas.Add(testvalores[columna])
Next
scadenas = tcadenas.Copy()
'Descendente es True y ascendente es False
If modo Then
scadenas.Sort(modo + gb.Natural).Reverse()
Else
scadenas.Sort(modo + gb.Natural)
Endif
For i = 0 To tcadenas.Max
aindices.Add(scadenas.Find(tcadenas))
Next
Endif
'Se han ordenado las cadenas y creado indices para ver los cambios de lugar
aotro = testvalores.Copy()
For fila = 0 To testvalores.Max
Swap testvalores[fila], aotro[aindices.Find(fila)]
Next
nombres.Clear()
nombres = testvalores
grd.Clear()
End
En parte el código es muy similar en este último. Casi repetido. Pero una cosa son las cadenas y otras las fechas.
Me he tenido que apoyar en otro array aotro.
A ver si se puede optimizar un poco más.
Ah, como ves para la creación del array aindices me he valido de búsquedas dentro del array con su método Find.
Me he llevado dos días liado con esto. Es increíble lo que absorbe estas cosas.
En el código que uso solo cadenas, "puede" llevarse a otros ejemplos, pero ya en el que uso cadenas y fechas
es muy exclusivo de la aplicación. Los números de las columnas ( sabiendo siempre donde están las fechas ).
Lo que quiero decir de esta última frase, es que cuando hacemos algo en programación , eso puede estar muy
ligado a la aplicación en concreto que estamos diseñando. (Hay que entender como funciona para poder trasladarlo a otro código ).
Entonces puede que eso no valga en otro ejemplo.
Y en realidad, estos son ejemplo para entender un poco la ordenación en un GridView y comprender el componente.
Desde los métodos Sort de los arrays, sus variaciones, incluidos si añadimos un idioma ( que tenga tildes ) y ademas
entender como funciona el Evento Data del GridView.
Coordinar para que todo funcione no siempre es fácil. Y naturalmente no hemos hablado de SQL, que seria lo ideal,
pero no vas a crear una base de dato para un pequeño ejemplo.
P.d Cacho texto he escrito.
Saludos