Gridview. Ordenar por columnas. - Versión para impresión +- Comunidad Gambas-es (https://gambas-es.org) +-- Foro: Gambas (https://gambas-es.org/forum-3.html) +--- Foro: General (https://gambas-es.org/forum-4.html) +--- Tema: Gridview. Ordenar por columnas. (/thread-1632.html) |
Gridview. Ordenar por columnas. - Shell - 14-03-2024 Buenos días! Estoy realizando un ejemplo con un GridView que tengo "algunos" nombres de escritores, poetas con su fecha de nacimiento y la de fallecimiento. Actualmente solo estoy ordenado la columna de las fechas donde hago click. Pero me encuentro con el problema de que cuando uso el evento Data no me muestra los cambios si "uso" el array que contiene todo los datos. Solo lo hace la primera vez. El gridview si lo hace si lo hago directamente, cambiando su contenido en el evento Sort. ( En este caso ). 'Comentar una opción u otra, para ver las diferencias. Ahora mismo usa la modificación del contenido directamente del gridview. Código fuente: Código: ' Gambas class file Y el código. Todavía tengo que mostrarlo todo junto, pero por ahora prefiero entender el motivo de que no funciona si cambio el array de array nombres, que no se actualice luego en el evento data del gridview. Algo que he visto raro, es que cuando muestro los nombres de los escritores en la consola, se añade dos saltos de línea al principio, cuando lo hace por primera vez. Saludos RE: GridView Evento Data - Shordi - 14-03-2024 El evento data sólo trabaja con celdas, no con columnas y el column[x].sort sólo cambia la flechita de la cabecera. Te remito a este video tutorial donde se explica cómo ordenar un array multidimensional y plasmarlo en un Gridview: saludos RE: GridView Evento Data - Shell - 14-03-2024 Jeje, llevo días si y días no viendo todo los tutoriales en los que expandiste la clase GridView. Lo dejé en su día y estos días los volvía retomar. Ese vídeo en concreto es que el estoy repasando. (14-03-2024, 14:07)Shordi escribió: El evento data sólo trabaja con celdas, no con columnas y el column[x].sort sólo cambia la flechita de la cabecera. Debo ser muy burro. Se esta asignando a "cada celda" el contenido del array nombres, ya que se ha variado. Si se varía este, el cambio debería reflejarse en las celdas , ¿ no ?. El column.sort da como resultado un número. Prueba. Cita: También usas un método para ordenarlo. Pero puede que ese método no funcione con fechas. Intenta ordenar una columna de fechas, usando Sort y sus formas de ordenar, creo que no funcionaba correctamente. Por eso decidí usar directamente un array de Dates y luego su método sort. Y unos de los principales problemas que hay que entender es: En Gridview solo se muestran "datos" (probablemente cadenas). Todo el "meollo" con lo que se trabaja, los cambios, ordenaciones se hacen en otro lugar, un procedimiento, una función. Hay que entender también que cada proyecto es un mundo, claro. Vale. Lo hice funcionar con la ayuda de tu videotutorial y cambiando cosas. Ahora tengo que modificar cosas para que todo se quede ordenado. ( Ahora las fechas no son correctas , es solo un ejemplo de ordenación ). He tenido que cambiar el contenido de Colum_Click y el Sort. (No es una clase ). Código: Public Sub grd_ColumnClick(Col As Integer) Ahora tengo que comprobar los indices. Adjunto el código con cambios hasta ahora. Saludos RE: GridView Evento Data - Shell - 14-03-2024 Encontré otra posibilidad usando el sorted de Gambas ( Mientras se pueda aprovechar ). Añadí la conversión de formato de fecha en el Data del GridView. Y solucioné el problema que al cambiar el array se mostrase correctamente en el GridView. Código: Public Sub grd_Data(Row As Integer, Column As Integer) Todas las ideas son buenas, naturalmente cada uno lo intenta hacer a su manera. RE: GridView Evento Data - Shordi - 14-03-2024 No entiendo qué quieres hacer. Si haces click en la fecha de nacimiento, por ejemplo, y se ordena sólo esa columna, toda la información del GridView queda inservible porque las celdas no coinciden dentro de la misma fila. Hay que reordenar todo el grid, no solo la columna Cita:Encontré otra posibilidad usando el sorted de Gambas ( Mientras se pueda aprovechar ).Conejudo. Yo no utilizo el sorted del GridView porque es excluyente, es decir sólo se puede ordenar por una columna. En este vídeo tienes el siguiente paso de ordenación por múltiples columnas. Este es el aspecto del ejemplo del vídeo, se ordena por País Ascendente y luego dentro de cada país por ciudad también Ascendente. No quise juntarlo todo en un sólo video por el tiempo que llevaba y la complejidad (a destacar el sistema que inventé para ordenaciones inversas que me resultó muy divertido con las funciones AntiWord y AntiNumber)... Saludos RE: GridView Evento Data - Shell - 16-03-2024 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) 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) 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 RE: GridView Evento Data - Shordi - 16-03-2024 Hasta el lunes no puedo ver tu código, pero una aclaración: en gambas un valor de fecha es un número entero. Se verá de una forma u otra según el formato que se le defina o el de el país que se use, pero si es una fecha es un número. Me da la sensación (ten en cuenta que no he visto tú código) que estás confundiendo fechas con "cadenas con formato de fecha". Si es así hablamos de cosas distintas. El lunes te lo digo, que hoy y mañana estoy en Benidorm donde vive mi hijo. Slaudos RE: GridView Evento Data - Shell - 16-03-2024 (16-03-2024, 14:36)Shordi escribió: Hasta el lunes no puedo ver tu código, pero una aclaración: en gambas un valor de fecha es un número entero Creo que un número float. (16-03-2024, 14:36)Shordi escribió: El lunes te lo digo, que hoy y mañana estoy en Benidorm donde vive mi hijo. Que lo disfrutes. Ya me aconsejarás cuando veas el código y que es lo mejor. Saludos RE: GridView Evento Data - Shell - 16-03-2024 (16-03-2024, 14:47)Shell escribió: Creo que un número float. Pues no, es un entero de 32 bit, que pena que la documentación que explica las fecha no este en español. Con el tiempo que lleva esto. Tampoco es difícil de entender. Date & time management RE: GridView Evento Data - Shell - 17-03-2024 He cambiado el método de ordenación. En este caso no es necesario conocer si la columna 1 o 2, contienen cadenas similares a una fecha. Código: Public Function OrdenarValores(Columna As Integer, modo As Boolean) As String[][] He cambiado la variable local i por j en el código, para que no queje el editor de la comunidad, la "i" la entiende como itálica. Saludos |