domingo, 26 de junio de 2011

Módulo Ordenar. Ordenar un gridviews con _ColumnClick

Y por que no, vamos a ordenar nuestro gridviews al estilo Excel o Calc. Cuando pulsemos en el titulo de la cabecera de la columna, nos lo ordenara (alfabeticamente).
¿Como lo hacemos?
Vamos a utilizar el evento _ColumnClick, que produce cuando hacemos click en el titulo de la columna. También crearemos una variable ordenlistado, que indicara como se ordenara (creciente de la A a la Z, o decreciente de la Z a la A). Esta variable es global, y la crearemos en el modulo var.
En el módulo Ordenar, crearemos dos procedimientos según el orden creciente (ord_AZ) o decreciente (ord_ZA), y le pasamos a los dos el grid que queremos ordenar (en nuestro caso el Fmain.Gridviewdatos) y la columna (Column), que le da valor al producirse el evento _ColumnClick.
En el módulo Var:
PUBLIC ordenlistado AS Integer



En el módulo Fmain:



PUBLIC SUB GridViewDatos_ColumnClick(Column AS Integer)
IF var.ordenlistado = 0 THEN
Ordenar.ord_AZ(GridViewDatos, Column)
var.ordenlistado = 1
ELSE
var. ordenlistado = 0
Ordenar.ord_ZA(GridViewDatos, Column)
ENDIF
END


En el módulo Ordenar:



' Gambas module file
PUBLIC SUB ord_AZ(grid AS GridView, a AS Integer)
'a: indica la columna a la que ordenamos
'grid: es la rejilla que ordenamos
DIM limite AS Integer
DIM cambio1 AS String
DIM i AS Integer
DIM j AS Integer
DIM col AS Integer
grid.visible = FALSE
limite = grid.Rows.COUNT
IF (grid.Columns.COUNT < a + 1) OR a < 0 THEN
Message.Error("Error en la columna introducida para ordenar")
GOTO salidaordenar
ENDIF
FOR i = 0 TO limite - 1
FOR j = 0 TO limite - 2
IF UCase$(Grid[j, a].Text) > UCase$(Grid[j + 1, a].Text) THEN
FOR col = 0 TO grid.Columns.COUNT - 1
cambio1 = Grid[j, col].Text
Grid[j, col].text = Grid[j + 1, col].Text
Grid[j + 1, col].text = cambio1
NEXT
ENDIF
NEXT
NEXT
salidaordenar:
grid.visible = TRUE
END


'------------------------------------------------------------------------
PUBLIC SUB ord_ZA(grid AS GridView, a AS Integer)
'a: indica la columna a la que ordenamos
'grid: es la rejilla que ordenamos
DIM limite AS Integer
DIM cambio1 AS String
DIM i AS Integer
DIM j AS Integer
DIM col AS Integer
grid.visible = FALSE
limite = grid.Rows.COUNT
IF (grid.Columns.COUNT < a + 1) OR a < 0 THEN
Message.Error("Error en la columna introducida para ordenar")
GOTO salidaordenar
ENDIF
FOR i = 0 TO limite - 2


FOR j = i TO limite - 1
IF UCase$(Grid[i, a].Text) <= UCase$(Grid[j, a].Text) THEN
FOR col = 0 TO grid.Columns.COUNT - 1
cambio1 = Grid[j, col].Text
Grid[j, col].text = Grid[i, col].Text
Grid[i, col].text = cambio1
NEXT
ENDIF
NEXT
NEXT
salidaordenar:
grid.visible = TRUE
END



Varias cosas a comentar:
1. El método de ordenacion elegido es el llamado “Burbuja”.
En internet podeis encontrar la explicación de este algoritmo de ordenación
(yo lo saque de alli )



2. No diferencio entre mayúsculas o minúsculas, usando UCase$, convierto las cadenas a mayúsculas y las comparos. Si hago click en la columna de las imagenes, se ordenan por la ruta donde esten ubicadas.

No hay comentarios:

Publicar un comentario