Autore Topic: GridView Sort  (Letto 579 volte)

Online Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.159
  • Tonno verde
    • Mostra profilo
GridView Sort
« il: 03 Aprile 2016, 23:30:48 »
Di recente nelle pagine della documentazione ufficiale di Gambas è stato inserito il codice postato da Milio in questa discussione e che era diventato anche lezione nella nostra Wiki ho deciso di provare la lezione e mi sono accorto che qualcosa non va ma prima di comunicarlo vorrei il vostro giudizio.

Il codice di Milio funziona così:
Inizia col ciclare tutte le righe della griglia (GridView) inserendo i dati contenuti nella colonna da ordinare (GridView1.Columns.Sort restituisce il numero di colonna) dentro il vettore (array) Values.
Il vettore ValueSorted copia i dati di Values e li ordina in base al risultato boleano restituito da GridView1.Columns.Ascending.
A questo punto il codice inizia col ciclare riga per riga e ad ogni riga inizia il secondo ciclo quello interno che scansiona tutte le colonne una a una.
Consideriamo ora il primo ciclo sia esterno (righe) che interno (colonne).
Ci troviamo pertanto ad analizzare i dati della prima riga della griglia cella per cella.
La prima cella della prima riga contiene i dati relativi all'ordinamento iniziale quello memorizzato attualmente nel vettore Values, il codice avvalendosi di Swap il metodo che permette di scambiare i valori passando quelli di una variabile all'altra e viceversa e avvalendosi anche del vettore ordinato ValueSorted cerca, attraverso il suo numero, la riga che deve prendere il posto della prima e ne scambia i valori facendo la stessa cosa per ogni cella.
Ma vediamo più da vicino cosa esattamente combina qui Swap perché non è del tutto evidente in prima lettura, potremo così apprezzare come il codice scritto sia geniale nella sua semplicità.
Nella griglia ci si sposta così GridView1[riga, colonna] la riga, ottenuta dal ciclo esterno come già detto attualmente è la prima (0) e lo è per tutto il ciclo interno, attualmente è prima anche la colonna (0) e il valore è dato da Text.
Con Swap scambiamo questo valore con quello trovato attraverso il metodo Find che ci restituisce il numero di riga del vettore Values (quello che conserva i valori originali) cercato attraverso il primo valore del vettore ordinato.
Quindi noi scambiamo uno a uno, ciclandoli per riga e per colonna, i valori della griglia basandoci sulle colonne di ordinamento originale e ordinata.
Occorre fare particolare attenzione a Find che così come è scritto qui Find(ValueSorted[Nx], 0, Nx) significa “trova (in Values) il valore ordinato n, confrontalo (comparalo) in modalità binaria, e valuta solo i valori dalla riga attuale escludendo le righe già valutate”.
Fatta l'operazione cruciale cancella i valori ormai obsoleti di Values e li aggiorna con quelli attuali per riprendere un nuovo ciclo riga, colonne.

Gambas la prima volta che apre la finestra chiama due volte il metodo Sort pertanto il codice così congegnato si offre con il valore rovesciato ma questo sarebbe facilmente ovviabile il punto è che nel codice di Milio si nasconde un piccolo errore in questo passaggio:
Codice: [Seleziona]
ValueSorted.Sort(GridView1.Columns.Ascending)
Sort si attende un intero gb.Ascent = 0 oppure gb.Descent = 16 e invece noi gli passiamo un booleano non da errore ma scombussola, infatti la freccetta che indica il verso di ordinamento appare rovesciata rispetto al senso.
Se noi cambiamo il codice della Wiki così:

Codice: [Seleziona]
   ' ValueSorted.Sort(GridView1.Columns.Ascending)'    
    If GridView1.Columns.Ascending Then
      ValueSorted.Sort(gb.Ascent)
    Else
     ValueSorted.Sort(gb.Descent)       
    Endif

Commentando o cancellando la riga incriminata il codice funziona regolarmente.
Siete d'accordo con la mia disamina?
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.334
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:GridView Sort
« Risposta #1 il: 04 Aprile 2016, 02:06:14 »
Ho l'impressione che sia una questione di interpretazione dell'ordine, o meglio di punto di riferimento dell'inizio dell'ordine.
Se la cella di inizio dell'ordinamento è considerata la prima in alto, in modo tale che l'ordine si sviluppa dalla prima cella in alto via verso il basso, allora il codice di Milio è coerente.  Infatti, prendendo come riferimento la prima colonna di indice zero (quella con i numeri), se impostiamo nella riga dell'intestazione la freccetta in basso (ordine discendente), vediamo che i numeri scendono da 2 a 0 (decrescente - discendente dall'alto verso il basso).
Invece, con la freccia al contrario (in alto) l'ordine va da 0 a 2 (crescente - ascendente dall'alto verso il basso).









« Ultima modifica: 04 Aprile 2016, 02:07:33 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. »

Online Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.159
  • Tonno verde
    • Mostra profilo
Re:GridView Sort
« Risposta #2 il: 04 Aprile 2016, 14:10:35 »
Attenzione sono d'accordo che se chiedo a una persona di indicarmi dove devo andare per ascendere dal pian terreno al quinto piano lui indicherà verso l'alto sempre che non mi picchi pensando che lo sto prendendo per i fondelli  :) ma...
In informatica, come nella vita, ordinare da A verso Z o da 0 verso 100 significa ordinare in modo crescente e normalmente le icone si presentano con la freccia rivolta verso il basso, questo perché la prima lettera o il primo numero si trova in cima alla griglia.
Infatti se noi lo chiediamo direttamente a Gambas lui ce lo dice.
Basta fare questa piccola prova:
Codice: [Seleziona]
Public Sub Form_Open()

  GridView1.Sorted = True
 
   With GridView1 
   .Columns.Count = 3 
   .Rows.Count = 3 
   .Header = GridView.Horizontal   
 End With     

End

Public Sub GridView1_Click()
 
  Print GridView1.Columns.Ascending;; " = che sale che tende verso l'alto come da A verso Z o da 0 verso 100." 
 
End

e poi cliccare su una qualunque cella della griglia.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:GridView Sort
« Risposta #3 il: 04 Aprile 2016, 14:33:22 »
Di recente nelle pagine della documentazione ufficiale di Gambas è stato inserito il codice postato da Milio in questa discussione

Adesso chiedo i diritti d'autore...  ;D

A dire il vero non mi ricordo se avevo copiato io dalla guida o e' stato solo farina del mio sacco  :rotfl:

Online Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.159
  • Tonno verde
    • Mostra profilo
Re:GridView Sort
« Risposta #4 il: 04 Aprile 2016, 14:51:38 »
 :D Ciao Milio,
infatti io passando il tuo codice ho solo detto che mi è stato insegnato da te, per cautela ho evitato di esporti troppo.  :D

Però a questo punto gradirei ci dessi un tuo parere, chi meglio di te lo può fare?

Sommessamente ti chiedo se puoi dare un'occhiata anche al post sui componenti e darci qualche dritta e/o direttiva.

Grazie
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Online Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.159
  • Tonno verde
    • Mostra profilo
Re:GridView Sort
« Risposta #5 il: 05 Aprile 2016, 00:32:39 »
È finito Montalbano, non è che Catarella mi abbia aiutato questa sera, purtroppo lato computer rimango l'asino che ero, pardon tonno.
Piuttosto dal vostro silenzio sul codice per chiedere la posizione della freccia secondo Gambas stesso, pare dal vostro silenzio che non siate d'accordo.
Ma non è evidente che se gli chiediamo quando ha la freccia in giù se è vero o falso di essere in stato ascendente lui ci risponde True e quando ha la freccia in alto ci risponde False?
Quindi?

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.334
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:GridView Sort
« Risposta #6 il: 05 Aprile 2016, 00:36:51 »
pare dal vostro silenzio che non siate d'accordo.

Quindi?
Guarda, molto probabilmente hai ragione tu.
Vorrei sentire l'opinione di Milio sul suo codice. Poi eventualmente faccio la modifica nella Wiki.
« 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 Sort
« Risposta #7 il: 05 Aprile 2016, 13:09:14 »
Di recente nelle pagine della documentazione ufficiale di Gambas è stato inserito il codice postato da Milio in questa discussione e che era diventato anche lezione nella nostra Wiki ho deciso di provare la lezione e mi sono accorto che qualcosa non va ma prima di comunicarlo vorrei il vostro giudizio.

Il codice di Milio funziona così:
Inizia col ciclare tutte le righe della griglia (GridView) inserendo i dati contenuti nella colonna da ordinare (GridView1.Columns.Sort restituisce il numero di colonna) dentro il vettore (array) Values.
Il vettore ValueSorted copia i dati di Values e li ordina in base al risultato boleano restituito da GridView1.Columns.Ascending.
A questo punto il codice inizia col ciclare riga per riga e ad ogni riga inizia il secondo ciclo quello interno che scansiona tutte le colonne una a una.
Consideriamo ora il primo ciclo sia esterno (righe) che interno (colonne).
Ci troviamo pertanto ad analizzare i dati della prima riga della griglia cella per cella.
La prima cella della prima riga contiene i dati relativi all'ordinamento iniziale quello memorizzato attualmente nel vettore Values, il codice avvalendosi di Swap il metodo che permette di scambiare i valori passando quelli di una variabile all'altra e viceversa e avvalendosi anche del vettore ordinato ValueSorted cerca, attraverso il suo numero, la riga che deve prendere il posto della prima e ne scambia i valori facendo la stessa cosa per ogni cella.
Ma vediamo più da vicino cosa esattamente combina qui Swap perché non è del tutto evidente in prima lettura, potremo così apprezzare come il codice scritto sia geniale nella sua semplicità.
Nella griglia ci si sposta così GridView1[riga, colonna] la riga, ottenuta dal ciclo esterno come già detto attualmente è la prima (0) e lo è per tutto il ciclo interno, attualmente è prima anche la colonna (0) e il valore è dato da Text.
Con Swap scambiamo questo valore con quello trovato attraverso il metodo Find che ci restituisce il numero di riga del vettore Values (quello che conserva i valori originali) cercato attraverso il primo valore del vettore ordinato.
Quindi noi scambiamo uno a uno, ciclandoli per riga e per colonna, i valori della griglia basandoci sulle colonne di ordinamento originale e ordinata.
Occorre fare particolare attenzione a Find che così come è scritto qui Find(ValueSorted[Nx], 0, Nx) significa “trova (in Values) il valore ordinato n, confrontalo (comparalo) in modalità binaria, e valuta solo i valori dalla riga attuale escludendo le righe già valutate”.
Fatta l'operazione cruciale cancella i valori ormai obsoleti di Values e li aggiorna con quelli attuali per riprendere un nuovo ciclo riga, colonne.

Gambas la prima volta che apre la finestra chiama due volte il metodo Sort pertanto il codice così congegnato si offre con il valore rovesciato ma questo sarebbe facilmente ovviabile il punto è che nel codice di Milio si nasconde un piccolo errore in questo passaggio:
Codice: [Seleziona]
ValueSorted.Sort(GridView1.Columns.Ascending)
Sort si attende un intero gb.Ascent = 0 oppure gb.Descent = 16 e invece noi gli passiamo un booleano non da errore ma scombussola, infatti la freccetta che indica il verso di ordinamento appare rovesciata rispetto al senso.
Se noi cambiamo il codice della Wiki così:

Codice: [Seleziona]
   ' ValueSorted.Sort(GridView1.Columns.Ascending)'    
    If GridView1.Columns.Ascending Then
      ValueSorted.Sort(gb.Ascent)
    Else
     ValueSorted.Sort(gb.Descent)       
    Endif

Commentando o cancellando la riga incriminata il codice funziona regolarmente.
Siete d'accordo con la mia disamina?
 :ciao:

D'accordissimo.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.334
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:GridView Sort
« Risposta #8 il: 05 Aprile 2016, 16:01:12 »
D'accordissimo.
Ho effettuato, dunque, la modifica nella relativa pagina della Wiki.
« 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. »

Online Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.159
  • Tonno verde
    • Mostra profilo
Re:GridView Sort
« Risposta #9 il: 05 Aprile 2016, 16:34:30 »
D'accordissimo.

E io l'ho detto a Lee così se vuol cambiare...

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Online Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.159
  • Tonno verde
    • Mostra profilo
Re:GridView Sort
« Risposta #10 il: 05 Aprile 2016, 22:26:17 »
Lee ha contro proposto questo e io per finirla li ho detto OK is the same

Codice: [Seleziona]
ValueSorted.Sort(IIf(GridView1.Columns.Ascending, gb.Ascent, gb.Descent))

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro