tincho   15-04-2021, 16:38
#1
Hola a todos.
En respuesta a Shell que proponía un ejemplo de como ordenar los elementos de un TableView, se me ocurrió proponer otra forma sin usar el evento _Data.
Código:
' Gambas class file

Private aState As Integer[]
Private aNamesSorted As New String[]
Private aAgesSorted As New Integer[]

Private aNames As String[] = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
Private aAges As New Integer[]
Private iLast As Integer = -1

Public Sub Form_Open()

  Dim i As Integer

  For i = 0 To aNames.Max
    aAges.Add(Rand(1, 100))
  Next

  aState = [0, 0]
  FormatTable(TableView1)

  aNamesSorted = aNames.Copy()
  aAgesSorted = aAges.Copy()

  DataTable(TableView1)

End

Public Sub FormatTable(tv As TableView)

  Dim r As Integer

  tv.Header = GridView.Horizontal
  tv.Columns.Count = 2
  tv.Rows.Count = aNames.Count
  'tv.Sorted = True
  tv.Columns[0].Title = ("Name")
  tv.Columns[1].Title = ("Age")

End

Public Sub DataTable(tv As TableView)

  Dim r As Integer

  For r = 0 To aNamesSorted.Max
    tv[r, 0].Text = aNamesSorted[r]
    tv[r, 1].Text = aAgesSorted[r]
  Next

End

Public Sub TableView1_ColumnClick(Column As Integer)

  Dim age As Integer
  Dim Name As String
  Dim id As Integer

  Select Column
    Case 0
      aNamesSorted.Clear
      aAgesSorted.Clear

      If aState[Column] = 0 Then
        aNamesSorted = aNames.Copy()
        aAgesSorted = aAges.Copy()
        aState[Column] = 1
      Else

        If aState[Column] = 1 Then
          aNamesSorted = aNames.Copy().Sort(gb.Ascent)
          aState[Column] = -1
        Else
          aNamesSorted = aNames.Copy().Sort(gb.Descent)
          aState[Column] = 0
        Endif

        For Each Name In aNamesSorted
          id = aNames.Find(Name)
          If id > -1 Then
            aAgesSorted.Add(aAges[id])
          Endif
        Next

      Endif

    Case 1
      aNamesSorted.Clear
      aAgesSorted.Clear

      If aState[Column] = 0 Then
        aAgesSorted = aAges.Copy()
        aNamesSorted = aNames.Copy()
        aState[Column] = 1
      Else

        If aState[Column] = 1 Then
          aAgesSorted = aAges.Copy().Sort(gb.Ascent)
          aState[Column] = -1
        Else
          aAgesSorted = aAges.Copy().Sort(gb.Descent)
          aState[Column] = 0
        Endif

        For Each age In aAgesSorted
          id = aAges.Find(age)
          If id > -1 Then
            aNamesSorted.Add(aNames[id])
          Endif
        Next

      Endif

  End Select

  DataTable(TableView1)

End
Saludos.
Última modificación: 19-04-2021, 23:31 por tincho.

1 Saludo.
Shell   19-04-2021, 22:19
#2
Tincho:

Me temo que no funciona del todo.
Ordena la columna de las edades en ambos sentidos. Prueba a ordenarla varias veces. Una de las veces el orden no queda bien.

Estado Inicial.

[Imagen: QbWVmwb.png]
Primera vez. Ordeno Columna de edades en orden ascendente.

[Imagen: GjRVxaI.png]

Segunda vez. Ordeno en orden descendente.

[Imagen: VATu5Xk.png]

Tercera vez. Orden Descendente. Valores incorrectos.

[Imagen: 5MDAGHs.png]

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   19-04-2021, 23:01
#3
(19-04-2021, 22:19)Shell escribió: Me temo que no funciona del todo.

Jeje, no lo has mirado bien. hay 3 estados no 2. sin ordenar, ascendente y descendente. el tercer clic vuelve al estado inicial
Saludos.

1 Saludo.
Shell   19-04-2021, 23:16
#4
(19-04-2021, 23:01)tincho escribió: Jeje, no lo has mirado bien. hay 3 estados no 2. sin ordenar, ascendente y descendente. el tercer clic vuelve al estado inicial

Nunca se me ocurrió un tercer estado. Así que era el "easter egg". Smile

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   19-04-2021, 23:30
#5
(19-04-2021, 23:16)Shell escribió: Nunca se me ocurrió

Smile

1 Saludo.
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.