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

Da Gambas-it.org - Wikipedia.
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
===Introduzione===
+
#REDIRECT [[Ordinare_i_valori_all'interno_di_una_colonna_di_una_GridView]]
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.
 
<BR>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)  <FONT color=#006400>' ''li individuo casualmente per creare il nostro esempio''</font>
 
  a.Add(k)        <FONT color=#006400>' ''li pongo in una variabile array''</font>
 
  Print a[j]      <FONT color=#006400>' ''li vedo in console come individuati in modo casuale''</font>
 
Next
 
 
 
<FONT color=#006400>' ''provvedo a ordinarli in modo crescente:''</font>
 
  a.Sort(gb.Ascent)
 
 
<FONT color=#006400>' ''li piazzo nella 1^ colonna così come finalmente ordinati:''</font>
 
  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
 
 
<FONT color=#006400>' ''impostiamo 6 colonne e 3 righe alla GridView:''</font>
 
  With GridView1
 
    .Columns.Count = 6
 
    .Rows.Count = 3
 
  End With
 
 
 
<FONT color=#006400>' ''Imponiamo una stringa in ciascuna delle tre celle della 1^ colonna:''</font>
 
  For j = 0 to 2
 
    With GridView1[j, 0]
 
<FONT color=#006400>' '' coloriamo di verde la nostra colonna:''</font>
 
      .Background = Color.Green
 
<FONT color=#006400>' '' per "semplificare" l'esempio, mettiamo solo un carattere:''</font>
 
      .Text = Chr(80 - j)
 
    End With
 
 
<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.
 
' ''Prendiamo quei caratteri *dall'interno di ciascuna cella* della colonna:''</font>
 
    a.Add(GridView1[j, 0].Text)
 
  Next
 
 
'''End'''
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim j As Byte
 
 
<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>
 
    a.Sort(gb.Ascent)
 
 
<FONT color=#006400>' ''Raggiungiamo così il nostro obiettivo finale di vedere "ordinati"
 
' ''all'interno della 1^ colonna:''</font>
 
    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 <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:
 
<FONT color=#B55555>
 
<BR>111p
 
<BR>55z
 
<BR>9a</font>
 
e <SPAN style="text-decoration:underline>non</span> il contrario, come ci aspetteremmo !
 
 
 
Per ovviare a questo inconveniente, uno stratagemma può essere quello di far aggiungere degli <SPAN style="text-decoration:underline">zero</span> dinanzi al primo carattere, in maniera tale che ciascuna stringa iniziale, alla quale saranno stati aggiunti quegli zero, abbia così lo <SPAN style="text-decoration:underline">stesso numero di caratteri</span> delle altre stringhe presenti nell'array. {[[#Note|2]]} Prendendo le stringhe di prima, insomma dovremo per esempio avere:
 
<BR>0111p
 
<BR>0055z
 
<BR>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
 
 
<FONT color=#006400>' ''Carichiamo quelle stringhe così modificate nella variabile array:''</font>
 
  a.Add(s)
 
 
  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:
 
<BR>0009a
 
<BR>0055z
 
<BR>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 1<SUP>a</sup> 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:
 
<FONT color=#B55555>
 
<BR>9a
 
<BR>55z
 
<BR>111p</font>
 
 
 
 
 
 
 
==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 <SPAN style="text-decoration:underline">contrario</span> 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.
 
 
 
<FONT color=#006400>' ''Gambas class file''</font>
 
 
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
 
 
<FONT color=#006400>' ''creiamo a caso delle stringhe che iniziano con una certa quantità di caratteri numerici:''</font>
 
  For j = 0 To 2
 
    GridView1[j, 0].Text = Str(CByte(Rnd(1, 200))) & "abc"
 
  Next
 
 
 
  For j = 0 To 2
 
<FONT color=#006400>' ''prende i valori stringa dalla colonna e li carica nell'array "a":''</font>
 
  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)
 
 
<FONT color=#006400>' ''piazza i valori nella colonna come riordinati:''</font>
 
  For j = 0 To 2
 
  GridView1[j, 1].Text = b[j]
 
  Next
 
 
  b = a
 
  b.sort(gb.Ascent)
 
 
<FONT color=#006400>' ''piazza i valori nella colonna come riordinati:''</font>
 
  For j = 0 To 2 
 
    GridView1[j, 4].Text = b[j]
 
  Next
 
 
'''End'''
 

Versione attuale delle 08:28, 29 ago 2020