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.
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:
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:
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
......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.
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
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
ed il gioco è fatto:
9a
55z
111p
...se md9327 :police: legge questa "pappa pronta", mi ammazza ! :death: :-X
...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:
' 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
???
Mi impiccio un attimo degli affari vostri...
Milio... Milio... sai bene che non sono fatti nostri. Non voglio fare la parte di Papa Ceskho I, ma chiunque deve poter intervenire nel forum.
ma i dati che ci sono nella griglia da dove provengono? sono editati a mano? provengono da una query? sono calcoli fatti via codice e rappresentati in griglia in un secondo momento?
Questo è un problema importante, anch'io analizzando la questione me lo sono posto.
uhm nn esiste un linked array come in vb.net in modo che se ordino un elemento si ordinano anche gli altri?
uhm... forse ho un idea... se ordinassi la prima colonna facendo spostare anche le altre righe? potrebbe funzionare....
come sposto una riga su o giù???
Pensavo anch'io ad operare sulle righe, ma spostando una riga, devi poi ordinare anche le altre sulla base dell'ordine dei valori relativi alla colonna sulla quale hai cliccato.
Nel frattempo mi permetto di segnalarti (qualora tu ne abbia bisogno), che, se hai intenzione di crearti un header della griglia, per sollevare l'evento quando clicchi su una cella di una colonna dell'header, devi usare questo:
Public Sub GridView1_ColumnClick(n As Integer)
Print "Hai cliccato nell'Header - colonna n. "; n
End
@vuott
l'evento giusto e' Sort...
il seguente codice funziona con stringhe... provalo e fammi sapere... ;)
Public Sub GridView1_Sort()
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()
ValueSorted.Sort(GridView1.Columns.Ascending)
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
@vuott
l'evento giusto e' Sort...
Bravo Milio, :-* hai risolto - come sempre - egregiamente il problema. Ehhh, ci vuole quello che ci vuole: non c'è niente da fare !
Allora, ho provato il tuo codice e ho capito anche come sollevare l'evento _Sort. Ho avuto modo di comprendere meglio pure il metodo .Sorted dell'oggetto Gridview. Riporto di seguito l'intero codice che ho usato per provare la tua soluzione (che è ovviamente ivi compresa):
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 scritto da Milio.
' 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() ' ora inizia il codice di Milio:
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()
ValueSorted.Sort(GridView1.Columns.Ascending)
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
Mi spiace, Raffa50, di non esserti stato d'aiuto: capisco che t'ho fatto effettivamente perdere solo tempo con quei miei inutili messaggi.
Dobbiamo ringraziare Milio, che ha risolto la tua interessante questione: la sua efficace soluzione può davvero essere utile a tutti per ottenere quell'operazione con le Gridview.
Io confermo con incrollabile fede: dinnanzi a Milio io alzo le mani ! :-[
In allegato potete ammirare un'antica icona che rappresenta il maestro Milio che suggerisce la suddetta soluzione a Raffa50 e Vuott.