Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Ordenar tabla
#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:

GAMBAS
  1. Private nombres As New String[]
  2. Private edades As New Byte[]
  3.  
  4. Public Sub Form_Open()
  5.  
  6.   nombres = ["Ana López Ruíz", "Carlos García Domingo", "José Zampaña Castillo", "Olivia Torres Ramirez",
  7.     "Antonio Pardo Casas", "María Castro Arenas", "Luis Cavanillas Torres", "Enrique Duarte Panda",
  8.     "Manuel Bonilla Perez", "Elisa Gutierrez Loma"]
  9.  
  10.   With tbEjemplo
  11.     .Header = tbEjemplo.Horizontal
  12.     .Rows.Count = nombres.Count
  13.     .Columns.Count = 2
  14.     .Columns[0].Title = "Nombres"
  15.     .Columns[0].Alignment = Align.Center
  16.     .Columns[1].Title = "Edades"
  17.     .Columns[1].Alignment = Align.Center
  18.     .Sorted = True  
  19.  
  20.   edades.Resize(nombres.Count)
  21.  
  22.  
  23. Public Sub tbEjemplo_Data(Row As Integer, Column As Integer)
  24.  
  25.   If Column = 0 Then tbEjemplo[Row, 0].Text = nombres[Row]
  26.   If Row Mod 2 = 0 Then tbEjemplo[Row, Column].Background = &hDDDDFF
  27.   tbEjemplo.Columns[0].Width = -1 'Ancho automático
  28.  
  29.  
  30. Public Sub tbEjemplo_Activate()
  31.  
  32.   If tbEjemplo.Column = 0 Then tbEjemplo.Edit
  33.  
  34.  
  35. Public Sub tbEjemplo_Click()
  36.  
  37.   If tbEjemplo.Column = 1 Then tbEjemplo.Edit
  38.  
  39.  
  40. Public Sub tbEjemplo_Save(Row As Integer, Column As Integer, Value As String)
  41.  
  42.   tbEjemplo[Row, Column].Text = Value
  43.   If Column = 1 Then
  44.     edades[Row] = Value
  45.   Else
  46.     nombres[Row] = Value
  47.  
  48.  
  49. Public Sub tbEjemplo_ColumnClick(Column As Integer)
  50.  
  51.   tbEjemplo.Save
  52.  
  53.   With tbEjemplo
  54.     '.Sorted = True
  55.     .Columns.Sort = Column
  56.   End With  
  57.   OrdenarTabla(tbEjemplo, Column, tbEjemplo.Columns.Ascending, Column = 1)
  58.     
  59.  
  60. Public Sub OrdenarTabla(latabla As TableView, Column As Integer, ascendente As Boolean, numerico As Boolean)
  61.  
  62.   Dim z As New String[]
  63.   Dim y As New String[]
  64.   Dim i, j As Integer
  65.  
  66.   For i = 0 To latabla.Rows.Max
  67.     If numerico Then
  68.       s = latabla[i, Column].Text
  69.       s = String(5 - Len(s), "0")
  70.     Else
  71.       s = latabla[i, Column].Text
  72.     Endif
  73.     For j = 0 To latabla.Columns.Max
  74.       s &= "-" & latabla[i, j].Text
  75.     Next
  76.     z.Add(s)
  77.   Next
  78.  
  79.   If ascendente Then
  80.     z.Sort(gb.Ascent)
  81.   Else
  82.     z.Sort(gb.Descent)
  83.  
  84.   For i = 0 To z.Max
  85.     y = Split(z[i], "-")
  86.     For j = 1 To y.Max
  87.       latabla[i, j - 1].Text = y[j]
  88.     Next
  89.   Next
  90.  
  91.  
  92. 'Modificado para el ejemplo usando el disponible en la ayuda online de Gambas
  93. ' Public Sub tbEjemplo_Sort()
  94. '
  95. '   Dim Values, ValueSorted As New String[]
  96. '   Dim Nx, iNx As Integer
  97. '
  98. '   ' Load sort column into string array
  99. '   For Nx = 0 To tbEjemplo.Rows.Max
  100. '     Values.Add(tbEjemplo[Nx, tbEjemplo.Columns.Sort].Text)
  101. '   Next
  102. '
  103. '   ' Copy values to new array and sort it based on status of sort indicator
  104. '   ValueSorted = Values.Copy()
  105. '   ValueSorted.Sort(IIf(tbEjemplo.Columns.Ascending, gb.Ascent, gb.Descent))
  106. '
  107. '   ' Iterate through table swapping appropriate values
  108. '   For Nx = 0 To ValueSorted.Max
  109. '     For iNx = 0 To tbEjemplo.Columns.Max
  110. '       Swap tbEjemplo[Nx, iNx].Text, tbEjemplo[Values.Find(ValueSorted[Nx], 0, Nx), iNx].Text
  111. '     Next
  112. '
  113. '     ' Pick up new order to preserve proper handling of indexing and duplicate values
  114. '     Values.Clear()
  115. '     For iNx = 0 To tbEjemplo.Rows.Max
  116. '       Values.Add(tbEjemplo[iNx, tbEjemplo.Columns.Sort].Text)
  117. '     Next
  118. '   Next
  119. '
  120. '   tbEjemplo.Refresh()
  121. '
  122. ' 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
    ¡Gracias!
#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.
[-] Los siguientes 1 usuarios dice gracias a tincho por este post:
  • Shell
    ¡Gracias!
#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
[-] Los siguientes 1 usuarios dice gracias a cogier por este post:
  • Shell
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)