Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buon sera.
Scusatemi forse vi sto sottoponendo un problema forse già da voi risolto e ripetitivo chiedo venia.
Volevo provare ad ordinare una listview in base ai valori di due colonne: la prima colonna contiene l'ID (numeri) la seconda delle stringhe (campo Oggetto).
Cliccando sulla testata della colonna, provo ad ordinare in base alla colonna.
A tal fine mi sono servito dell'ottima guida Cap. 66 sulla ListView che ho trovato qui tra le guide su VB.NET.
Ho provato a realizzare quando suggerito utilizzando tra l'altro questi snippet di codice:
Codice sorgente - presumibilmente VB.NET
PrivateSub SortListViewItems(ByVal List As ListView, ByVal Comparer As IComparer(Of ListViewItem))
Dim Occurrences As Int32 = 0
Do
Occurrences = 0
For I As Int32 = 0 To List.Items.Count- 1
If I = List.Items.Count- 1 Then
Continue For
EndIf
If Comparer.Compare(List.Items(I), List.Items(I + 1))= 1 Then
SwapInList(List, I)
Occurrences += 1
EndIf
Next
Loop Until Occurrences = 0
EndSub
ma mi sembra che non esca mai dal loop perché Occurrences é sempre =2. Non riesco a trovare l'errore. Provato su una listview con 6 item ma non va.
Inoltre nella routine di swap:
Codice sorgente - presumibilmente VB.NET
PrivateSub SwapInList(ByVal List As ListView, ByVal Index As Int32)
Dim Temp As ListViewItem = List.Items(Index + 1)
List.Items.RemoveAt(Index + 1)
List.Items.InsertIGNORE((Index, Temp))
EndSub
l'istruzione
Codice sorgente - presumibilmente Plain Text
List.Items.Insert IGNORE((Index, Temp))
sembra errata mi viene segnalata IGNORE per cui ho provato a toglierlo e scriverla così
Codice sorgente - presumibilmente Plain Text
List.Items.Insert(Index, Temp)
Qualcuno potrebbe aiutarmi? Grazie
Ultima modifica effettuata da alip1 il 28/06/2021 alle 19:26
Per ordinare qualsiasi colonna in una listview cliccandola è sufficiente una riga di codice.
La prima parte dell'esempio popola con dei dati a caso una listview che devi aggiungere sul form.
La listview non deve avere il sorting automatico della prima colonna, pena un loop di riordinamento (vedi riga 5).
Codice sorgente - presumibilmente VB.NET
PublicClass Form1
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
'************ CODICE INUTILE, SOLO PER RIEMPIRE LA LISTVIEW ***************
ListView1.View= View.Details
ListView1.Sorting= SortOrder.None
ListView1.GridLines=True
ListView1.FullRowSelect=True
ListView1.Scrollable=True
ListView1.Columns.Add("ID")' prima colonna
ListView1.Columns(0).Width=40' la colonna ID 40 pix
For c = 0 To9
ListView1.Columns.Add("colonna"& c +1)' nome della colonna
Per ordinare ho usato Linq.
Non è l'unico sistema, si possono usare molteplici approci, come IComparer ma anche altri.
Linq, va studiato per padroneggiarlo, funcion(t) è una dichiarazione
la riga:
Dim tmp() As ListViewItem = ListView1.Items.Cast(Of ListViewItem)().OrderBy(Function(t) t.SubItems(e.Column).Text).ToArray()
significa: dichiaro una matrice di oggetti ListViewItem
enumero applicando la conversione di tipo (cast) usando la funzione Linq OrderBy(Function(t) tutte le righe secondo l'ordine dei testi (Text) contenuti nella colonna cliccata (t.SubItems(e.Column)) in un array (tmp())
Perché ti ho proposto Linq, che richiede ulteriore studio per essere compreso?
Perché una listview con 8 colonne e 20000 righe viene riordinata istantaneamente con Linq, se invece esegui i cicli tu, compari e swappi da codice, no.
Invece non ho analizzato il tuo codice che sicuramente si può far funzionare, per problemi di tempo, l'esempio che ti ho postato l'avevo scritto qualche tempo fa e messo da parte quando studiavo.
Ultima modifica effettuata da Carlo il 30/06/2021 alle 10:55
Grazie Carlo gentilissimo come sempre ho capito.
Un'ultima domanda L'istruzione è indipendente se si tratta di un Campo ID numerico o un campo di tipo Data??
Grazie
Grazie Carlo gentilissimo come sempre ho capito.
Non sapendo come fare in effetti pensavo di usare anche facendo una query tipo linq ma poi, come dicevo, mi sono rifatto all'esempio pubblicato nella guida su vb.net del sito, solo che non funzionava perchè non avevo messo
Codice sorgente - presumibilmente Plain Text
LVTutte.Sorting = SortOrder.None
come suggerito da te.
Due ultime domande:
1) l'istruzione da te suggerita è indipendente se si tratta di un Campo ID numerico o un campo di tipo Data??
2) una listview quante righe può contenere??
Grazie
Postato originariamente da alip1: 1) l'istruzione da te suggerita è indipendente se si tratta di un Campo ID numerico o un campo di tipo Data??
L'istruzione esegue un riordinamento alfabetico case insensitive, per ordinare i numeri è sufficiente visualizzarli con gli zeri all'inizio, come vedi nell'esempio sulla colonna ID.
Per un ordinamento mirato sul contenuto delle colonne, devi aggiungere una scelta in base alla colonna cliccata e al suo contenuto.
Per esempio se la colonna che contiene delle date è la numero1:
Postato originariamente da alip1: 2) una listview quante righe può contenere??
Vado a memoria, se compili a 32bit c'è un limite 65536 ? (sempre se la memoria è sufficiente in base alle colonne)
se compili a 64bit, il limite è dato dalla memoria disponibile.
Ma per sicurezza controlla.
Aggiungo che una listview con un numero elevato di righe/colonne, diventa ingestibile, e la sua visualizzazione può richiedere del tempo.
Una soluzione è tenere i dati in matrici, liste, tuple, in RAM, e caricare dinamicamente nella listview solo la parte visibile al momento.
Ultima modifica effettuata da Carlo il 30/06/2021 alle 14:17