Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - C# Problema Con i File, ListView
Forum - C# / VB.NET - C# Problema Con i File, ListView

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Segnala al moderatore
Postato alle 19:53
Venerdì, 01/10/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++

  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.                   } while (line != null);
  11.                    sr.Close();
  12.              }


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?

PM
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Up
2
Down
V
Segnala al moderatore
Postato alle 21:08
Venerdì, 01/10/2010
La lettura del file dovrebbe essere fatta in un nuovo thread.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
2
Down
V
Segnala al moderatore
Postato alle 10:03
Sabato, 02/10/2010
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é.

PM
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 7:24
Sabato, 02/10/2010
mi potresti aiutare xfavore? mi fai un esempio? grazie! :(

PM
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 11:12
Sabato, 02/10/2010

Come sugerito da Totem

Codice sorgente - presumibilmente C++

  1. 1.
  2.       if (e.KeyCode == Keys.S)
  3.    2.
  4.                   {
  5.    3.
  6.                           StreamReader sr = new StreamReader("C:\\file.txt");
  7.    4.
  8.                           int i =0;
  9.    5.
  10.                           do
  11.    6.
  12.                           {
  13.    7.
  14.                               line = sr.ReadLine();
  15.    8.
  16.                               listView1.Items.Insert(i, line);
  17.    9.
  18.                               i++;
  19.  
  20.   10.                       Application.DoEvents  
  21.  
  22.                         } while (line != null);
  23.   11.
  24.                          sr.Close();
  25.   12.
  26.                    }



If ok Then GOTO Avanza else GOTO Inizia

PM
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 13:48
Sabato, 02/10/2010
Ciao, con VB io farei cosi

Codice sorgente - presumibilmente VB.NET

  1. Public Sub CaricaFile(ByVal path As String)
  2.  
  3.         If IO.File.Exists(path) = True Then
  4.             On Error Resume Next
  5.             Using sr As New System.IO.StreamReader(path, System.Text.Encoding.GetEncoding(1252))
  6.                 Dim p As Boolean = True
  7.                 Form1.Lista.Items.Clear()
  8.                 While sr.Peek() <> -1
  9.                     Dim l() As String = sr.ReadLine().Split(vbTab)
  10.                     Dim b As Boolean = True
  11.                     Dim lvi As ListViewItem = Nothing
  12.                     For Each s As String In l
  13.                         If b Then
  14.                             lvi = New ListViewItem(s)
  15.                             b = False
  16.                         Else
  17.                             lvi.SubItems.Add(s)
  18.                         End If
  19.                         Application.DoEvents()
  20.                     Next
  21.                     If p = False Then
  22.                         Form1.Lista.Items.Add(lvi)
  23.                     Else
  24.                         p = False
  25.                     End If
  26.                 End While
  27.             End Using
  28.         End If
  29.     End Sub



nota che così gli fai salvare anche gli headers delle colonne
:k:

Ultima modifica effettuata da dedalux il 02/10/2010 alle 13:50
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 8:15
Mercoledì, 06/10/2010
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

  1. gino
  2. pino
  3. pinco
  4. pallino
  5. pippo
  6. pluto


Gli elementi aggiunti saranno:
Codice sorgente - presumibilmente Plain Text

  1. gino header2 header3 header4 header5
  2. gino pino header3 header4 header5
  3. gino pino pinco header4 header5
  4. gino pino pinco pallino header5
  5. gino pino pinco pallino pippo
  6. 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

  1. gino pino pinco pallino pippo pluto
  2.  
  3. file.ReadLine().Split(" ")   ' = {"gino", "pino", "pinco", "pallino", "pippo", "pluto"}



PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 21:50
Mercoledì, 06/10/2010
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.

PM
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:49
Sabato, 02/10/2010
ragazzi ho provato! così:
Codice sorgente - presumibilmente C++

  1. if (e.KeyCode == Keys.S)
  2.             {
  3.                 leggi();
  4.             }
  5.         }
  6.  
  7.         private void leggi()
  8.         {
  9.             StreamReader sr = new StreamReader("C:\\file.txt");
  10.             int i = 0;
  11.             do
  12.             {
  13.                 line = sr.ReadLine();
  14.                 listView1.Items.Insert(i, line);
  15.                 i++;
  16.                 Application.DoEvents();
  17.             } while (line != null);
  18.            
  19.             sr.Close();
  20.  
  21.         }


ma il programma si blocca e non mi fa nemmeno uscire!! qual'è il problema?

PM
Pagine: [ 1 2 3 ] Precedente | Prossimo