Shell   15-04-2021, 14:01
#1
Buenas!.

Pues ya que estamos. Tengo una tabla tal como esta.

[Imagen: 1c1Gyun.png]

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:

[Imagen: ZmoIYn2.png]

Con los números (texto).

[Imagen: ztUzgWi.png]

 ¿ 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
Archivos adjuntos
.gz
EjemploConTabla-0.0.1.tar.gz (Tamaño: 12.72 KB Descargas: 2)
Última modificación: 15-04-2021, 14:35 por Shell.
tincho   15-04-2021, 16:40
#2
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.

1 Saludo.
cogier   15-04-2021, 17:23
#3
Mi solución es añadir ceros a los números antes de clasificarlos. 

[Imagen: PreSort.png]

[Imagen: PostSort.png]
Archivos adjuntos
.gz
TestNew-0.0.9.tar.gz (Tamaño: 12.47 KB Descargas: 3)
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.