Ho messo nel seguente articolo un po' di codice VB.NET
http://blogs.ugidotnet.org/idamiani/articles/14227.aspx
Il codice sopra implementa un form con: un timer, un button, una listview e una treeview. Il codice comprende tutto quello che serve per farlo girare: l'unica accortezza è di modificare il codice del Form_Load e cambiare la directory. Cosa fa? Beh, è semplice: data una directory (appunto), preleva l'elenco dei files contenuti e li mostra nella listview (nomefile, dimensione e il tipo di file).
Fatto questo, si crea un ArrayList con i valori univoci dei tipi di files e popola una TreeView, creando tanti nodi quanti sono i tipi di files. Ok, basta. Il bottone refresha l'elenco. Il timer refresha l'elenco ogni 4 secondi. Il codice sopra funziona perfettamente: sia che clicco il button, sia lasciando che sia il timer, la listview e la treeview si ripopolano ogni volta, senza troppi problemi.
Concettualmente, il codice riportato sopra si avvicina moltissimo a quello che ho scritto nella mia applicazione. In quest'ultima però il "ripopolamento" della treeview è interrotto da un brutto errore (mai incontrato prima!!). Per risolvere, dovrei usare (a quanto pare!) BeginInvoke, perchè il tutto viene gestito da un thread secondario. Dimostrato dal fatto che InvokeRequired = True. La cosa interessante è che nell'80% dei casi l'errore non appare (anche lasciando sollevare l'evento Timer del timer, appunto).
Il codice non è esattamente lo stesso di quello scritto nell'applicazione, conto di 1) prendere il codice qui sopra e 2) avvicinarlo pian piano al codice reale dell'applicazione. Non è semplicissimo perchè in realtà nell'applicazione finale la listview viene popolata attraverso un ArrayList piena di oggetti restituitomi da un ws (oggetti FileRemoto). Però in fondo mi interessa ricreare la stessa struttura per capire veramente come risolvere l'errore. La cosa è discussa sul forum ugidotnet.org, nella sezione Windows Forms