Differenze tra le versioni di "Ordinare i valori all'interno di una colonna di una GridView"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "===Introduzione=== Per ordinare i valori all'interno di una colonna, sia in modo ascendente che discendente, non esiste - attualmente - una specifica funzione di Gambas. Infat...")
 
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 4: Riga 4:
  
 
==Ordinare valori ''numerici''==
 
==Ordinare valori ''numerici''==
 
 
Ipotizziamo 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.
 
Ipotizziamo 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.
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
Riga 35: Riga 34:
 
==Ordinare valori ''stringa''==
 
==Ordinare valori ''stringa''==
 
Possiamo ordinare all'interno delle colonne, come più in generale all'interno di un array, anche valori ''stringa''.
 
Possiamo ordinare all'interno delle colonne, come più in generale all'interno di un array, anche valori ''stringa''.
 
 
  Private a As New String[]
 
  Private a As New String[]
 
   
 
   
Riga 41: Riga 39:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
Dim j As Byte
+
  Dim j As Byte
 
   
 
   
 
  <FONT color=#006400>' ''impostiamo 6 colonne e 3 righe alla GridView:''</font>
 
  <FONT color=#006400>' ''impostiamo 6 colonne e 3 righe alla GridView:''</font>
Riga 48: Riga 46:
 
     .Rows.Count = 3
 
     .Rows.Count = 3
 
   End With
 
   End With
 
 
   
 
   
 
  <FONT color=#006400>' ''Imponiamo una stringa in ciascuna delle tre celle della 1^ colonna:''</font>
 
  <FONT color=#006400>' ''Imponiamo una stringa in ciascuna delle tre celle della 1^ colonna:''</font>
  For j = 0 to 2
+
  For j = 0 to 2
    With GridView1[j, 0]
+
    With GridView1[j, 0]
 
  <FONT color=#006400>' '' coloriamo di verde la nostra colonna:''</font>
 
  <FONT color=#006400>' '' coloriamo di verde la nostra colonna:''</font>
      .Background = Color.Green
+
      .Background = Color.Green
 
  <FONT color=#006400>' '' per "semplificare" l'esempio, mettiamo solo un carattere:''</font>
 
  <FONT color=#006400>' '' per "semplificare" l'esempio, mettiamo solo un carattere:''</font>
      .Text = Chr(80 - j)
+
      .Text = Chr(80 - j)
    End With
+
    End With
 
   
 
   
  <FONT color=#006400>' '' Inseriamo ciascun carattere in una variabile stringa array,
+
  <FONT color=#006400>' '' Inseriamo ciascun carattere in una variabile stringa array, perché "solo così", potremo utilizzare una funzione di Gambas per poter procedere al riordino dei caratteri.''
' ''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:''</font>
 
  ' ''Prendiamo quei caratteri *dall'interno di ciascuna cella* della colonna:''</font>
 
     a.Add(GridView1[j, 0].Text)
 
     a.Add(GridView1[j, 0].Text)
Riga 67: Riga 62:
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
Riga 73: Riga 67:
 
   Dim j As Byte
 
   Dim j As Byte
 
   
 
   
  <FONT color=#006400>' ''Nonostante vi siano dei caratteri, è possibile effettuare anche
+
  <FONT color=#006400>' ''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):''</font>
' ''con essi al loro riordino ! Riordino che avverrà nel rispetto
+
  a.Sort(gb.Ascent)
' ''della sequenza imposta nel protocollo ASCII. Provvediamo, dunque,
 
' ''ad ordinare qui i caratteri in modo "ascendente" (dalla A alla Z):''</font>
 
    a.Sort(gb.Ascent)
 
 
   
 
   
  <FONT color=#006400>' ''Raggiungiamo così il nostro obiettivo finale di vedere "ordinati"
+
  <FONT color=#006400>' ''Raggiungiamo così il nostro obiettivo finale di vedere "ordinati" all'interno della 1^ colonna:''</font>
' ''all'interno della 1^ colonna:''</font>
+
  For j = 0 to 2
    For j = 0 to 2
+
    GridView1[j, 0].Text = a[j]
      GridView1[j, 0].Text = a[j]
+
  Next
    Next
 
 
   
 
   
 
  '''End'''
 
  '''End'''
 
+
Sarà semplice, come ora mostrato, se il primo carattere delle ''stringhe'' (qualunque lunghezza esse abbiano) è una lettera dell'alfabeto; ma se dinnanzi alle lettere c'è una <SPAN style="text-decoration:underline">quantità di caratteri numerici</span> <SUP>&#091;[[#Note|nota 1]]&#093;</sup> <SPAN style="text-decoration:underline">diversa</span> da una stringa rispetto ad un'altra, il comportamento della funzione di Gambas, per effettuare il riordino, cambia.
 
 
 
 
Sarà semplice, come ora mostrato, se il primo carattere delle ''stringhe'' (qualunque lunghezza esse abbiano) è una lettera dell'alfabeto; ma se dinnanzi alle lettere c'è una <SPAN style="text-decoration:underline">quantità di caratteri numerici {[[#Note|1]]} diversa</span> da una stringa rispetto ad un'altra, il comportamento della funzione di Gambas, per effettuare il riordino, cambia.
 
 
Infatti, se per esempio facciamo compiere il riordino (<SPAN style="text-decoration:underline">ascendente</span>, come prima) di queste tre stringhe: "''55z''", "''111p''" e "''9a''", il riordino prenderà in considerazione il <SPAN style="text-decoration:underline">primo</span> carattere sulla base del protocollo ASCII. In tal caso avremo questo riordino:
 
Infatti, se per esempio facciamo compiere il riordino (<SPAN style="text-decoration:underline">ascendente</span>, come prima) di queste tre stringhe: "''55z''", "''111p''" e "''9a''", il riordino prenderà in considerazione il <SPAN style="text-decoration:underline">primo</span> carattere sulla base del protocollo ASCII. In tal caso avremo questo riordino:
 
<FONT color=#B55555>
 
<FONT color=#B55555>
Riga 106: Riga 93:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
Dim j As Byte
+
  Dim j As Byte
Dim s as string
+
  Dim s as string
 
   
 
   
 
   For j = 0 To 2
 
   For j = 0 To 2
Riga 113: Riga 100:
 
   
 
   
 
  <FONT color=#006400>' ''Carichiamo quelle stringhe così modificate nella variabile array:''</font>
 
  <FONT color=#006400>' ''Carichiamo quelle stringhe così modificate nella variabile array:''</font>
  a.Add(s)
+
    a.Add(s)
 
 
   Next
 
   Next
 
 
e procedendo quindi al riordino mediante il predetto metodo ''variabile_Array.<FONT color=#B55555>Sort</font>'', riusciremo ad ottenere il riordino di quelle particolari stringhe; ed avremo la nuova disposizione degli elementi all'interno dell'array come segue:
 
e procedendo quindi al riordino mediante il predetto metodo ''variabile_Array.<FONT color=#B55555>Sort</font>'', riusciremo ad ottenere il riordino di quelle particolari stringhe; ed avremo la nuova disposizione degli elementi all'interno dell'array come segue:
 
<BR>0009a
 
<BR>0009a
Riga 123: Riga 108:
  
 
Successivamente elimineremo gli zero che abbiamo ''strategicamente'' aggiunto:
 
Successivamente elimineremo gli zero che abbiamo ''strategicamente'' aggiunto:
 
 
  For j = 0 To 2
 
  For j = 0 To 2
 
   a[j] = Replace(a[j], "0", "")
 
   a[j] = Replace(a[j], "0", "")
 
  Next
 
  Next
 
 
e ripiazziamo, così, nella 1<SUP>a</sup> colonna quelle tre stringhe, ri-ordinate e ripulite dagli zero che avevamo aggiunto:
 
e ripiazziamo, così, nella 1<SUP>a</sup> colonna quelle tre stringhe, ri-ordinate e ripulite dagli zero che avevamo aggiunto:
 
 
  For j = 0 To 2
 
  For j = 0 To 2
 
   GridView1[j, 0].Text = a[j]
 
   GridView1[j, 0].Text = a[j]
Riga 135: Riga 117:
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
cosìcché avremo alla fine il riordino delle stringhe iniziali, e raggiunto il nostro obiettivo:
 
cosìcché avremo alla fine il riordino delle stringhe iniziali, e raggiunto il nostro obiettivo:
 
<FONT color=#B55555>
 
<FONT color=#B55555>
Riga 154: Riga 135:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
    
 
    
Dim j, k As Byte
+
  Dim j, k As Byte
 
   
 
   
 
   With GridView1
 
   With GridView1
Riga 161: Riga 142:
 
   End With
 
   End With
 
   
 
   
  a.Clear
+
  a.Clear
 
   
 
   
 
  <FONT color=#006400>' ''creiamo a caso delle stringhe che iniziano con una certa quantità di caratteri numerici:''</font>
 
  <FONT color=#006400>' ''creiamo a caso delle stringhe che iniziano con una certa quantità di caratteri numerici:''</font>
Riga 175: Riga 156:
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
    
 
    
 
  '''Public''' Sub Button2_Click()
 
  '''Public''' Sub Button2_Click()
 
   
 
   
Dim b As New String[]
+
  Dim b As New String[]
Dim j As Byte
+
  Dim j As Byte
 
   
 
   
 
   b = a
 
   b = a
Riga 187: Riga 167:
 
  <FONT color=#006400>' ''piazza i valori nella colonna come riordinati:''</font>
 
  <FONT color=#006400>' ''piazza i valori nella colonna come riordinati:''</font>
 
   For j = 0 To 2
 
   For j = 0 To 2
  GridView1[j, 1].Text = b[j]
+
    GridView1[j, 1].Text = b[j]
 
   Next
 
   Next
 
   
 
   
Riga 194: Riga 174:
 
   
 
   
 
  <FONT color=#006400>' ''piazza i valori nella colonna come riordinati:''</font>
 
  <FONT color=#006400>' ''piazza i valori nella colonna come riordinati:''</font>
  For j = 0 To 2   
+
  For j = 0 To 2   
    GridView1[j, 4].Text = b[j]
+
    GridView1[j, 4].Text = b[j]
  Next
+
  Next
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione attuale delle 11:55, 6 gen 2022

Introduzione

Per ordinare i valori all'interno di una colonna, sia in modo ascendente che discendente, non esiste - attualmente - una specifica funzione di Gambas. Infatti, i metodi .Sorted e .Sort disponibili per l'oggetto "GridView" non hanno quello scopo.
Per ottenere, dunque, il riordino dei valori, siano essi numerici che lettere dell'alfabeto, o anche stringhe alfanumeriche, bisognerà scrivere un apposito algoritmo a parte. Una soluzione può essere quella di caricare in una variabile array i valori da riordinare, e successivamente compiere il riordino mediante il metodo .Sort disponibile con la variabile array medesima.

Ordinare valori numerici

Ipotizziamo 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.

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


Ordinare valori stringa

Possiamo ordinare all'interno delle colonne, come più in generale all'interno di un array, anche valori stringa.

Private a As New String[]


Public Sub Form_Open()

 Dim j As Byte

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

' Imponiamo 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)

' Raggiungiamo così 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

Sarà semplice, come ora mostrato, 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 [nota 1] diversa da una stringa rispetto ad un'altra, il comportamento della funzione di Gambas, 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. {2} Prendendo le stringhe di prima, insomma dovremo per esempio avere:
0111p
0055z
0009a


Facendo riferimento al codice sopra mostrato, faremo queste variazioni:

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:

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:

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

End

cosìcché avremo alla fine il riordino delle stringhe iniziali, e raggiunto il nostro obiettivo:
9a
55z
111p


Note

[1] Attenzione ! Stiamo qui parlando di caratteri che rappresentano numeri, e non di valori di tipo numerico (Byte, Float, Integer, Long).

[2] In vero, si è notato che è possibile anche ottenere il riordino di tali stringhe alfanumeriche senza utilizzare quella strategia degli zero da aggiungere. Sarà comunque sempre necessario il metodo ".Sort" di una variabile array di tipo Stringa, imponendo come Modo il contrario 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 aggiungere gli zero, a beneficio della semplificità e maggiore brevità del codice.

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))) & "abc"
 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