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

Offline Raffa50

  • Grande Gambero
  • ***
  • Post: 101
    • Mostra profilo
[RISOLTO] GridView ordinare in base a una colonna
« il: 07 Giugno 2012, 18:46:31 »
Salve esiste una opzione che permette di ordinare in base a una colonna una gridview se clicco su quella colonna?
non sò se mi spiego voglio una cosa in stile mac... dove nelle intestazioni delle tabelle c'è la freccetta per ordinare... si può fare?
« Ultima modifica: 07 Luglio 2012, 16:21:45 da Raffa50 »

Offline Raffa50

  • Grande Gambero
  • ***
  • Post: 101
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #1 il: 07 Giugno 2012, 18:48:10 »
ho impostato la proprietà sorted a true ma nn ordina,,, ke faccio?
inoltre come faccio a eliminare un elemento selezionato?
« Ultima modifica: 07 Giugno 2012, 22:58:14 da Raffa50 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #2 il: 07 Giugno 2012, 23:05:57 »
ho impostato la proprietà sorted a true ma nn ordina,,, ke faccio?
Io, come ho già detto altre volte, non ho molta esperienza con 'ste griglie  :-X ...ma avrei un metodo efficace ...per complicarsi un po' la vita.  ;D

Dunque... immaginiamo di avere una GridView con 5 righe e 3 colonne. In una prima fase avremo nella prima colonna 5 numeri posti in modo non ordinato (li sceglieremo casualmente per ottenere l'esempio). Successivamente, in quella colonna tali valori saranno inseriti e mostrati in modo ordinato crescente.

Codice: gambas [Seleziona]

Public Sub Form_Open()

 Dim j, k As Byte
 Dim a As New Byte[]

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

 For j = 0 To 4
   k = Rnd(1, 100)    ' li individuo casualmente per creare il nostro esempio
   a.Add(k)                ' li pongo in una variabile array
   Print a[j]               ' li vedo in console come individuati in modo casuale
 Next

' provvedo a ordinarli in modo crescente:
  a.Sort(gb.Ascent)
 
' li piazzo nella 1^ colonna così come finalmente ordinati:
  For j = 0 To 4
   GridView1[j, 0].Text = a[j]
  Next

End

  :rolleyes:
« Ultima modifica: 08 Giugno 2012, 12:25:22 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 #3 il: 14 Giugno 2012, 10:38:41 »
ehm... io ho più colonne e più righe...  :rolleyes:

tracker.Columns.Sort  ma nn funziona XD
« Ultima modifica: 14 Giugno 2012, 11:03:58 da Raffa50 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #4 il: 14 Giugno 2012, 11:21:28 »
tracker.Columns.Sort  ma nn funziona XD

Sì, avevo notato anche io questa cosa, non sono riuscito a capire come va fatto funzionare "Sort" in questo caso.   :-\
Ecco perché ho escogitato un percorso più lungo, ma comunque efficace.
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #5 il: 14 Giugno 2012, 13:36:39 »
non sono riuscito a capire come va fatto funzionare "Sort" in questo caso.   :-\

Allora... ho visto un po' la documentazione.
l'istruzione: Gridview.Columns.Sort:
* non serve (purtroppo) per ordinare i valori all'interno di una colonna;
* va utilizzata insieme con e dopo l'istruzione: Gridview.Sorted;
* ...e serve semplicemente per evidenziare una colonna (magari quella, ma non è vincolante, dove saranno inseriti i dati eventualmente ordinati con apposito codice, da fare a parte).

Esempio pratico:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  With GridView1
    .Columns.Count = 5
    .rows.Count = 5
  End With

' La seguente istruzione imposta "se" una colonna
' (da indicarsi nella successiva istruzione) sarà evidenziata o no:
    GridView1.Sorted = True

' La seguente riga imposta "quale" colonna sarà evidenziata
' (ad esempio evidenziamo la numero 4, ossia la 5^):
    GridView1.Columns.Sort = 4

End


Prova a cambiare il numero dell'ultima istruzione... "per vedere l'effetto che fa".



Aggiorno questo messaggio: una reale utilità e funzione di .Sorted può essere vista qui:
http://www.gambas-it.org/smf/index.php?topic=2170.msg24086#msg24086
« Ultima modifica: 22 Novembre 2012, 15:44:13 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 #6 il: 15 Giugno 2012, 12:31:11 »
si ma se i dati vengono tutti gestiti dalla gridview il tuo esempio per oridare nn funziona...
ho un grid con 6 colonne e tot righe... se voglio ordinare per una colonna che contiene string come si fà???

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #7 il: 15 Giugno 2012, 13:21:05 »
si ma se i dati vengono tutti gestiti dalla gridview il tuo esempio per oridare nn funziona...
ho un grid con 6 colonne e tot righe... se voglio ordinare per una colonna che contiene string come si fà???

Perdonami, mi sembra evidente che io non ho capito  :-\ purtroppo il problema che hai posto.

Inoltre, in quest'ultima tua riga non ho capito  :-\ se tu vuoi semplicemente ordinare per ciascuna delle 6 colonne il proprio contenuto (fatto di stringhe), oppure se vuoi prendere le stringhe, presenti nelle celle di tutte e 6 le colonne, e riordinarle insieme (insomma mischiandole) in un'unica colonna (per esempio una settima).


Ad ogni modo, la cosa certa è che secondo la documentazione, confermata anche da Minisini da me appositamente consultato su questa questione del .Sort), il riordino dei valori all'interno delle colonne (o delle righe) va effettuato a livello di codice mediante un algoritmo che dovrà essere escogitato e scritto direttamente dal programmatore. Quindi attualmente non c'è una funzione o comunque un metodo di Gambas preconfezionato (come invece v'è per le variabili array).
« Ultima modifica: 15 Giugno 2012, 13:28:14 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #8 il: 16 Giugno 2012, 02:34:10 »
......ad ogni modo voglio provare a seguire un percorso considerando l'ipotesi di voler mettere in ordine le stringhe presenti nelle celle di una sola colonna.

Codice: gambas [Seleziona]

Private a As New String[]


Public Sub Form_Open()

 Dim j As Byte

' Allora... impostiamo 6 colonne e alcune righe alla GridView:
  With GridView1
    .Columns.Count = 6
    .Rows.Count = 3
  End With

' Ci inventiamo qui, per poter creare l'esempio, un "motore" a manovella
' che im-ponga una stringa in ciascuna delle tre celle della 1^ colonna:
   For j = 0 to 2
     With GridView1[j, 0]
' coloriamo di verde la nostra colonna:
       .Background = Color.Green
' per "semplificare" l'esempio, mettiamo solo un carattere:
       .Text = Chr(80 - j)
     End With

' Inseriamo ciascun carattere in una variabile stringa array,
' perché "solo così", potremo utilizzare una funzione di Gambas
' per poter procedere al riordino dei caratteri.
' Prendiamo quei caratteri *dall'interno di ciascuna cella* della colonna:
     a.Add(GridView1[j, 0].Text)
   Next

End


Public Sub Button1_Click()

  Dim j As Byte

' Nonostante vi siano dei caratteri, è possibile effettuare anche
' con essi al loro riordino ! Riordino che avverrà nel rispetto
' della sequenza imposta nel protocollo ASCII. Provvediamo, dunque,
' ad ordinare qui i caratteri in modo "ascendente" (dalla A alla Z):
    a.Sort(gb.Ascent)

' Raggiungo il nostro obiettivo finale di vedere "ordinati"
' all'interno della 1^ colonna:
    For j = 0 to 2
      GridView1[j, 0].Text = a[j]
    Next

End


ATTENZIONE ! Tutto tranquillo se il primo carattere delle stringhe (qualunque lunghezza esse abbiano) è una lettera dell'alfabeto; ma se dinnanzi alle lettere c'è una quantità di caratteri numerici diversa da una stringa rispetto ad un'altra, il comportamento della funzione, per effettuare il riordino, cambia !
Infatti, se per esempio facciamo compiere il riordino (ascendente, come prima) di queste tre stringhe: "55z", "111p" e "9a", il riordino prenderà in considerazione il primo carattere sulla base del protocollo ASCII. In tal caso avremo questo riordino:
111p
55z
9a

e non il contrario, come ci aspetteremmo !

Per ovviare a questo inconveniente, uno stratagemma può essere quello di far aggiungere degli zero dinanzi al primo carattere, in maniera tale che ciascuna stringa iniziale, alla quale saranno stati aggiunti quegli zero, abbia così lo stesso numero di caratteri delle altre stringhe presenti nell'array. Prendendo le stringhe di prima, insomma dovremo per esempio avere:
0111p
0055z
0009a

Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim j As Byte
 Dim s as string

  For j = 0 To 2
    s = String$(5 - Len(GridView1[j, 0].Text), "0") & GridView1[j, 0].Text

' Carichiamo quelle stringhe così modificate nella variabile array:
    a.Add(s)
  Next


e procedendo quindi al riordino mediante il predetto metodo variabile_Array.Sort, riusciremo ad ottenere il riordino di quelle particolari stringhe; ed avremo la nuova disposizione degli elementi all'interno dell'array come segue:
0009a
0055z
0111p

Successivamente elimineremo gli zero che abbiamo strategicamente aggiunto:
Codice: gambas [Seleziona]

For j = 0 To 2
  a[j] = Replace(a[j], "0", "")
Next


e ripiazziamo, così, nella 1a colonna quelle tre stringhe, ri-ordinate e ripulite dagli zero che avevamo aggiunto:
Codice: gambas [Seleziona]

   For j = 0 To 2
      GridView1[j, 0].Text = a[j]
    Next

 End


ed il gioco è fatto:
9a
55z
111p



...se md9327  :police: legge questa "pappa pronta", mi ammazza !  :death:    :-X
« Ultima modifica: 16 Giugno 2012, 13:30:47 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #9 il: 16 Giugno 2012, 12:49:26 »
 >:( :evil: >:( :evil: >:( :evil:

 ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #10 il: 16 Giugno 2012, 13:51:38 »
>:( :evil: >:( :evil: >:( :evil:
Ho come... un brutto presentimento....


Nell'immagine allegata potete vedere Vuott trascinato da md9327 dinnanzi al tribunale speciale di Papa Ceskho I per il supplizio finale.  :skull:
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #11 il: 16 Giugno 2012, 16:44:20 »
 :D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #12 il: 17 Giugno 2012, 16:46:01 »
...strana scoperta:   :-\

è possibile ottenere il riordino di stringhe contenenti una qualsiasi quantità di caratteri numerici iniziali, anche diverso da stringa e stringa. Si dovrà comunque effettuare sempre mediante il metodo ".Sort" di una variabile array di tipo Stringa, imponendo come Modo il contrario  :rolleyes: di quello che si vuole ottenere. Così, se vogliamo un riordino di tipo ascendente, porremo varArr.Sort(gb.Descent). Viceversa, se vogliamo ottenere un riordino di tipo discendente, porremo varArr.Sort(gb.Ascent).
Questo, seppur logicamente incoerente, ci eviterà di usare la strategia, prima sopra esposta, di aggiungere gli zero, a beneficio della semplificità e lunghezza del codice.

Non so... fate anche voi la prova da brivido:
Codice: gambas [Seleziona]

' Gambas class file

Private a As New String[]


Public Sub Button1_Click()
 
 Dim j, k As Byte

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

   a.Clear

' creiamo a caso delle stringhe che iniziano con una certa quantità di caratteri numerici:
  For j = 0 To 2
     GridView1[j, 0].Text = Str(CByte(Rnd(1, 200))) & "alibaba"
  Next
 
  For j = 0 To 2
' prende i valori stringa dalla colonna e li carica nell'array "a":
   a.Add(GridView1[j, 0].Text)
  
Next

End

Public Sub Button2_Click()

 Dim b As New String[]
 Dim j As Byte

  b = a
  b.sort(gb.Descent)

' piazza i valori nella colonna come riordinati:
  For j = 0 To 2
   GridView1[j, 1].Text = b[j]
  Next

  b = a
  b.sort(gb.Ascent)

' piazza i valori nella colonna come riordinati:
   For j = 0 To 2  
     GridView1[j, 4].Text = b[j]
   Next

End


   ???
« Ultima modifica: 17 Giugno 2012, 17:35:40 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 #13 il: 25 Giugno 2012, 15:02:48 »
nn credo ke tu abbia capito....

ci sono x righe ok?
io clicco su una colonna le righe vengono ordinate in base all'ordinamento di quella colonna chiaro? è un pò quello che succede in phpmyadmin...

è come un database se ordino per id anche le altre colonne si spostano esempio:

id | nome
2 | aaa
1 | bbb

se dico di orinare per id otterrò:
1 | bbb
2 | aaa

se ordina per nome ottengo il risultato di partenza... chiaro?
« Ultima modifica: 25 Giugno 2012, 15:08:55 da Raffa50 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.705
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: GridView ordinare in base a una colonna
« Risposta #14 il: 25 Giugno 2012, 16:41:55 »
chiaro?
Adesso che sei stato più dettagliato, credo di sì.

La mia modesta opinione è che a te serve un algoritmo, un procedimento a livello di codice per ottenere quel riordino così complesso. Complesso, semplicemente perché in base alla colonna sulla quale si clicca avviene il tipo di riordino delle righe in tutte le colonne !
Però, qui stiamo parlando non più della soluzione di un singolo argomento, bensì - mi pare - della scrittura dell'intero procedimento secondo il quale, cliccando sull'header - o comunque sulla prima riga - di una colonna, si ottiene un certo modo di riordino in tutte le colonne. :-[  ...ma questo, ahimé !, non te lo scriverà neppure Papa Ceskho I, pio ed eremita. Non per cattiveria, ovviamente !
Bisogna vedere se c'è qualcuno che, avendo lavorato con le griglie, abbia già affrontato questo problema del riordino in un colpo solo dei valori in tutte le colonne sulla base della colonna cliccata.
« Ultima modifica: 25 Giugno 2012, 16:52: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. »