Ordenar tabla - Shell - 15-04-2021
Buenas!.
Pues ya que estamos. Tengo una tabla tal como esta.
Tiene dos columnas, nombres y edades por ejemplo. La columna de las edades es editable.
Me gustaría ordenarla tanto por nombres como edades y un orden que sea "natural" ( por decirlo de alguna manera).
Como tal, no son números lo que vemos en la tabla, son textos o caracteres. De ahí el problema.
De principio este es el código:
Código: Private nombres As New String[]
Private edades As New Byte[]
Public Sub Form_Open()
nombres = ["Ana López Ruíz", "Carlos García Domingo", "José Zampaña Castillo", "Olivia Torres Ramirez",
"Antonio Pardo Casas", "María Castro Arenas", "Luis Cavanillas Torres", "Enrique Duarte Panda",
"Manuel Bonilla Perez", "Elisa Gutierrez Loma"]
With tbEjemplo
.Header = tbEjemplo.Horizontal
.Rows.Count = nombres.Count
.Columns.Count = 2
.Columns[0].Title = "Nombres"
.Columns[0].Alignment = Align.Center
.Columns[1].Title = "Edades"
.Columns[1].Alignment = Align.Center
.Sorted = True
End With
edades.Resize(nombres.Count)
End
Public Sub tbEjemplo_Data(Row As Integer, Column As Integer)
If Column = 0 Then tbEjemplo[Row, 0].Text = nombres[Row]
If Row Mod 2 = 0 Then tbEjemplo[Row, Column].Background = &hDDDDFF
tbEjemplo.Columns[0].Width = -1 'Ancho automático
End
Public Sub tbEjemplo_Activate()
If tbEjemplo.Column = 0 Then tbEjemplo.Edit
End
Public Sub tbEjemplo_Click()
If tbEjemplo.Column = 1 Then tbEjemplo.Edit
End
Public Sub tbEjemplo_Save(Row As Integer, Column As Integer, Value As String)
tbEjemplo[Row, Column].Text = Value
If Column = 1 Then
edades[Row] = Value
Else
nombres[Row] = Value
Endif
End
Public Sub tbEjemplo_ColumnClick(Column As Integer)
tbEjemplo.Save
With tbEjemplo
'.Sorted = True
.Columns.Sort = Column
End With
OrdenarTabla(tbEjemplo, Column, tbEjemplo.Columns.Ascending, Column = 1)
End
Public Sub OrdenarTabla(latabla As TableView, Column As Integer, ascendente As Boolean, numerico As Boolean)
Dim z As New String[]
Dim y As New String[]
Dim s As String
Dim i, j As Integer
For i = 0 To latabla.Rows.Max
If numerico Then
s = latabla[i, Column].Text
s = String(5 - Len(s), "0")
Else
s = latabla[i, Column].Text
Endif
For j = 0 To latabla.Columns.Max
s &= "-" & latabla[i, j].Text
Next
z.Add(s)
Next
If ascendente Then
z.Sort(gb.Ascent)
Else
z.Sort(gb.Descent)
Endif
For i = 0 To z.Max
y = Split(z[i], "-")
For j = 1 To y.Max
latabla[i, j - 1].Text = y[j]
Next
Next
End
'Modificado para el ejemplo usando el disponible en la ayuda online de Gambas
' Public Sub tbEjemplo_Sort()
'
' Dim Values, ValueSorted As New String[]
' Dim Nx, iNx As Integer
'
' ' Load sort column into string array
' For Nx = 0 To tbEjemplo.Rows.Max
' Values.Add(tbEjemplo[Nx, tbEjemplo.Columns.Sort].Text)
' Next
'
' ' Copy values to new array and sort it based on status of sort indicator
' ValueSorted = Values.Copy()
' ValueSorted.Sort(IIf(tbEjemplo.Columns.Ascending, gb.Ascent, gb.Descent))
'
' ' Iterate through table swapping appropriate values
' For Nx = 0 To ValueSorted.Max
' For iNx = 0 To tbEjemplo.Columns.Max
' Swap tbEjemplo[Nx, iNx].Text, tbEjemplo[Values.Find(ValueSorted[Nx], 0, Nx), iNx].Text
' Next
'
' ' Pick up new order to preserve proper handling of indexing and duplicate values
' Values.Clear()
' For iNx = 0 To tbEjemplo.Rows.Max
' Values.Add(tbEjemplo[iNx, tbEjemplo.Columns.Sort].Text)
' Next
' Next
'
' tbEjemplo.Refresh()
'
' End
No tengo problema con ordenar los nombres, pero si con los números.
Con los nombres:
Con los números (texto).
¿ Qué estoy haciendo mal ?.
Podría crear un array y ordenar esos números y luego mostrarlos, pero entonces,¿ que hago con la columna de los nombres ?.
¿ Qué debería hacer para que quedasen juntos el nombre y la edad en su fila correspondiente al ordenarse ?.
Marchando el código.
Algo complicado...(Esto hubiera sido otro mensaje, contestando al anterior..pero es otro lio con el editor).
O al menos no encuentro la forma adecuada.
17.7.4 GridView - Sorting the data
El ejemplo se puede bajar en alemán, se puede traducir. Desde Gambas se puede traducir ciertas partes de la aplicación. Lo que vemos
se traduce, el contenido de un botón, la parte visual de un formulario.
Pregunto. Si el ejemplo si se sube a la comunidad. ¿ En que idioma debe subirse ?
"Sprichst du Deutsch ? "
En parte me parece enrevesado, crear una clase. Y por otro lado que aún no se haya solucionado o pretendido dar una solución en el IDE de Gambas.
O es propio de la librería.
Saludos
RE: Ordenar tabla - tincho - 15-04-2021
Hola Shell.
Me pareció interesante tu pregunta así que decidí hacer un ejemplo independiente, en vez de modificar el tuyo.
Espero que te sirva para lo que deseas hacer.
Saludos.
RE: Ordenar tabla - cogier - 15-04-2021
Mi solución es añadir ceros a los números antes de clasificarlos.
|