Ordinare in una GridView i valori di più righe in base ad una colonna

Da Gambas-it.org - Wikipedia.

Avendo una griglia con diverse righe e diverse colonne, può sorgere la necessità di ordinare i valori di dette righe in base alla colonna sulla quale si clicchi.

Facciamo l'esempio di una griglia, costituita da tre righe e tre colonne; ciascuna colonna contiene dei valori nelle proprie celle. L'intento è quello di ordinare i valori di una colonna, cliccando nella cella della colonna medesima nell'header, e conseguentemente anche i valori delle altre colonne secondo lo spostamento dei valori della colonna cliccata. Avremo quindi lo spostamento delle righe della griglia in base al riordino dei valori presenti nella colonna cliccata.

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.  
' 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() [nota 1]
   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()    
    If GridView1.Columns.Ascending Then
      ValueSorted.Sort(gb.Ascent)
    Else
      ValueSorted.Sort(gb.Descent)        
    Endif
    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


Note

[1] Questa parte di codice è stata elaborata dall'utente Milio del forum di Gambas-it.org .