Autore Topic: [RISOLTO] GridView ordinare in base a una colonna  (Letto 6924 volte)

Offline Raffa50

  • Grande Gambero
  • ***
  • Post: 101
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #15 il: 25 Giugno 2012, 18:26:50 »
uhm nn esiste un linked array come in vb.net in modo che se ordino un elemento si ordinano anche gli altri?

uhm... forse ho un idea... se ordinassi la prima colonna facendo spostare anche le altre righe? potrebbe funzionare....
come sposto una riga su o giù???

(con la treeview si può fare, con le grid nn lo sò)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #16 il: 25 Giugno 2012, 20:28:36 »
Mi impiccio un attimo degli affari vostri... ma i dati che ci sono nella griglia da dove provengono? sono editati a mano? provengono da una query? sono calcoli fatti via codice e rappresentati in griglia in un secondo momento?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #17 il: 25 Giugno 2012, 21:36:51 »
Mi impiccio un attimo degli affari vostri...
Milio... Milio...  sai bene che non sono fatti nostri. Non voglio fare la parte di Papa Ceskho I, ma chiunque deve poter intervenire nel forum.

ma i dati che ci sono nella griglia da dove provengono? sono editati a mano? provengono da una query? sono calcoli fatti via codice e rappresentati in griglia in un secondo momento?
Questo è un problema importante, anch'io analizzando la questione me lo sono posto.


uhm nn esiste un linked array come in vb.net in modo che se ordino un elemento si ordinano anche gli altri?

uhm... forse ho un idea... se ordinassi la prima colonna facendo spostare anche le altre righe? potrebbe funzionare....
come sposto una riga su o giù???
Pensavo anch'io ad operare sulle righe, ma spostando una riga, devi poi ordinare anche le altre sulla base dell'ordine dei valori relativi alla colonna sulla quale hai cliccato.
Nel frattempo mi permetto di segnalarti (qualora tu ne abbia bisogno), che, se hai intenzione di crearti un header della griglia, per sollevare l'evento quando clicchi su una cella di una colonna dell'header, devi usare questo:
Codice: gambas [Seleziona]

Public Sub GridView1_ColumnClick(n As Integer)

  Print "Hai cliccato nell'Header - colonna n. "; n

End
« Ultima modifica: 25 Giugno 2012, 21:54:41 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #18 il: 25 Giugno 2012, 22:17:38 »
@vuott

l'evento giusto e' Sort...
il seguente codice funziona con stringhe... provalo e fammi sapere...  ;)

Codice: gambas [Seleziona]
Public Sub GridView1_Sort()
Dim Values, ValueSorted As New String[]
Dim Nx, iNx As Integer
Dim tmp As String

  For Nx = 0 To GridView1.Rows.Max
    Values.Add(GridView1[Nx, GridView1.Columns.Sort].Text)
  Next
  ValueSorted = Values.Copy()
  ValueSorted.Sort(GridView1.Columns.Ascending)
  For Nx = 0 To ValueSorted.Max
    For iNx = 0 To GridView1.Columns.Max
      Swap GridView1[Nx, iNx].Text, GridView1[Values.Find(ValueSorted[Nx], 0, Nx), iNx].Text
    Next
    Values.Clear()
    For iNx = 0 To GridView1.Rows.Max
      Values.Add(GridView1[iNx, GridView1.Columns.Sort].Text)
    Next
  Next
  GridView1.Refresh()

End

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #19 il: 26 Giugno 2012, 00:22:14 »
@vuott

l'evento giusto e' Sort...

Bravo Milio,  :-* hai risolto - come sempre - egregiamente il problema.  Ehhh, ci vuole quello che ci vuole: non c'è niente da fare !

Allora, ho provato il tuo codice e ho capito anche come sollevare l'evento _Sort. Ho avuto modo di comprendere meglio pure il metodo .Sorted dell'oggetto Gridview. Riporto di seguito l'intero codice che ho usato per provare la tua soluzione (che è ovviamente ivi compresa):
Codice: gambas [Seleziona]

Public Sub Form_Open()

Dim j As Byte

  With GridView1
    .Columns.Count = 3
    .Rows.Count = 3
  End With

  With GridView1
    .Header = 1
    .Columns[0].Alignment = Align.Center
    .Columns[0].Title = "Id"
    .Columns[1].Alignment = Align.Center
    .Columns[1].Title = "Nome"
    .Columns[2].Alignment = Align.Center
    .Columns[2].Title = "Altro"
    
  End With


  For j = 0 To 2
    With GridView1[j, 0]
      .Text = CStr(j)
    End With
    With GridView1[j, 1]
      .Text = Chr(80 - j)
    End With
    With GridView1[j, 2]
      .Text = CStr(Fix(Rnd(10, 50)))
    End With
  Next

' questo consente di sollevare l'evento _Sort scritto da Milio.
' Infatti se si omette, non funziona più.
' (E' possibile omettere  " .Columns.Sort = 0 ": di default è la colonna num. 0):
With GridView1
  .Sorted = True
  .Columns.Sort = 0
End With

End


Public Sub GridView1_Sort()                  ' ora inizia il codice di Milio:
    Dim Values, ValueSorted As New String[]  
    Dim Nx, iNx As Integer  
    Dim tmp As String  
      
     For Nx = 0 To GridView1.Rows.Max  
       Values.Add(GridView1[Nx, GridView1.Columns.Sort].Text)  
     Next  
     ValueSorted = Values.Copy()  
     ValueSorted.Sort(GridView1.Columns.Ascending)  
     For Nx = 0 To ValueSorted.Max  
       For iNx = 0 To GridView1.Columns.Max  
         Swap GridView1[Nx, iNx].Text, GridView1[Values.Find(ValueSorted[Nx], 0, Nx), iNx].Text  
       Next  
       Values.Clear()  
       For iNx = 0 To GridView1.Rows.Max  
         Values.Add(GridView1[iNx, GridView1.Columns.Sort].Text)  
       Next  
     Next  
     GridView1.Refresh()  
      
 End  


Mi spiace, Raffa50, di non esserti stato d'aiuto: capisco che t'ho fatto effettivamente perdere solo tempo con quei miei inutili messaggi.
Dobbiamo ringraziare Milio, che ha risolto la tua interessante questione: la sua efficace soluzione può davvero essere utile a tutti per ottenere quell'operazione con le Gridview.

Io confermo con incrollabile fede: dinnanzi a Milio io alzo le mani !   :-[



In allegato potete ammirare un'antica icona che rappresenta il maestro Milio che suggerisce la suddetta soluzione a Raffa50 e Vuott.
« Ultima modifica: 26 Giugno 2012, 12:36:18 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Raffa50

  • Grande Gambero
  • ***
  • Post: 101
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #20 il: 07 Luglio 2012, 16:20:21 »
risolto