carmine (Member)
Pro
Messaggi: 168
Iscritto: 20/04/2010
|
Ragazzi ho bisogno di leggere un file txt, e di stampare il suo contenuto in una listview in questo modo:
Codice sorgente - presumibilmente C++ |
if (e.KeyCode == Keys.S) { StreamReader sr = new StreamReader("C:\\file.txt"); int i =0; do { line = sr.ReadLine(); listView1.Items.Insert(i, line); i++; } while (line != null); sr.Close(); }
|
ma quando entra nella funzione si blocca il programma e non mi fa fare + niente!! :S
cosa sbaglio? mi potreste indicare la procedura giusta per far si che riesca nel mio intento?
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
La lettura del file dovrebbe essere fatta in un nuovo thread.
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Non puoi usare un nuovo thread perché dovresti accedere alla ListView da quel thread, generando un'eccezione CrossThreadOperationException: per risolverla dovresti parafrasare il codice con almeno un paio di invocazioni a delegati.
In questo caso, paradossalmente, è meglio un Application.DoEvents.
http://msdn.microsoft.com/it-it/library/system.windows.for ...
Puoi al massimo separare solo la lettura del file in un thread diverso, ma quello che prende più tempo in questo codice è l'aggiunta dell'elemento alla ListView, non la ReadLine in sé.
|
|
carmine (Member)
Pro
Messaggi: 168
Iscritto: 20/04/2010
|
mi potresti aiutare xfavore? mi fai un esempio? grazie!
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Come sugerito da Totem
Codice sorgente - presumibilmente C++ |
1. if (e.KeyCode == Keys.S) 2. { 3. StreamReader sr = new StreamReader("C:\\file.txt"); 4. int i =0; 5. do 6. { 7. line = sr.ReadLine(); 8. listView1.Items.Insert(i, line); 9. i++; 10. Application.DoEvents } while (line != null); 11. sr.Close(); 12. }
|
If ok Then GOTO Avanza else GOTO Inizia
|
|
dedalux (Normal User)
Pro
Messaggi: 155
Iscritto: 14/02/2009
|
Ciao, con VB io farei cosi
Codice sorgente - presumibilmente VB.NET |
Public Sub CaricaFile(ByVal path As String) If IO. File. Exists(path ) = True Then On Error Resume Next Using sr As New System.IO.StreamReader(path, System.Text.Encoding.GetEncoding(1252)) Dim p As Boolean = True Form1.Lista.Items.Clear() While sr.Peek() <> -1 Dim l() As String = sr.ReadLine().Split(vbTab) Dim b As Boolean = True Dim lvi As ListViewItem = Nothing For Each s As String In l If b Then lvi = New ListViewItem(s) b = False Else lvi.SubItems.Add(s) End If Application.DoEvents() Next If p = False Then Form1.Lista.Items.Add(lvi) Else p = False End If End While End Using End If End Sub
|
nota che così gli fai salvare anche gli headers delle colonne
Ultima modifica effettuata da dedalux il 02/10/2010 alle 13:50 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
E' sbagliato... tu leggi una linea intera e la depositi in una cella dell'array, quindi inzializzi un elemento della listview con tale array, il quale conterrà solo uno (o due, o tre, ...) valori letti dal file e gli altri saranno header. Ad esempio, se il file è questo:
Codice sorgente - presumibilmente Plain Text |
gino
pino
pinco
pallino
pippo
pluto
|
Gli elementi aggiunti saranno:
Codice sorgente - presumibilmente Plain Text |
gino header2 header3 header4 header5
gino pino header3 header4 header5
gino pino pinco header4 header5
gino pino pinco pallino header5
gino pino pinco pallino pippo
pluto pino pinco pallino pippo
|
Che solo palesemente tutti errati.
Prima devi formattare il file in maniera diversa, mettendo più elementi su una linea sola, separati da uno spazio. Poi fai uno String.Split sul risultato della readline e ottieni l'array di valori corretti:
Codice sorgente - presumibilmente Plain Text |
gino pino pinco pallino pippo pluto
file.ReadLine().Split(" ") ' = {"gino", "pino", "pinco", "pallino", "pippo", "pluto"}
|
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Riga 6 e 7: le inizializzazioni sono superflue; le variabili vengono comunque inizializzate ad altri oggetti nel while (con il risultato che allochi due oggetti in più che non vengono mai usati).
Qui non c'è la riga 45, ma hai usato un ciclo a condizione finale con line!=null. Quando si legge un file si deve usare un ciclo a condizione iniziale (while do e non do while). Infatti il ciclo termina solo quando line == null, ma questo significa che stai richiamando Split da un oggetto che non esiste, poiché file.ReadLine ritorna null. Questo succederà sempre se non cambi il codice.
|
|
carmine (Member)
Pro
Messaggi: 168
Iscritto: 20/04/2010
|
ragazzi ho provato! così:
Codice sorgente - presumibilmente C++ |
if (e.KeyCode == Keys.S) { leggi(); } } private void leggi() { StreamReader sr = new StreamReader("C:\\file.txt"); int i = 0; do { line = sr.ReadLine(); listView1.Items.Insert(i, line); i++; Application.DoEvents(); } while (line != null); sr.Close(); }
|
ma il programma si blocca e non mi fa nemmeno uscire!! qual'è il problema?
|
|