2016-04-25 2 views
0

Ich habe bereits das Speichern von Teil und ich weiß, es funktioniert, aber wenn ich auf Laden klicken, wird es nichts anzeigen, dass ich aus den Textfeldern gespeichert habe, die an die gehen saying.txt dateiLaden von einem TXT zu einem Listenfeld in C#

using System; 
using System.IO; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
public partial class Grades : Form 
{ 

    private StreamWriter fil; 
    public Grades() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      fil = new StreamWriter("saying.txt"); //This is the txt file 
     } 
     catch (DirectoryNotFoundException exc) 
     { 
      lstBxDisplay.Text = "Nothing " + 
       exc.Message; 
     } 
     catch (System.IO.IOException exc) 
     { 
      lstBxDisplay.Text = exc.Message; 
     } 
    }  

    // saving the files to the saying.txt 
    private void btnSaveAs_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      fil.WriteLine(txtBxLastName.Text); 
      txtBxLastName.Text = ""; 
      txtBxLastName.Focus(); 
     } 
     catch (System.IO.IOException exc) 
     { 
      lstBxDisplay.Text = exc.Message; 
     } 
    } 

    // next is the load button to load the files into the list/display box 
    private void btnLoad_Click(object sender, EventArgs e) 
    { 


     string inValue; 

     try 
     { 
      using (StreamReader infil = 
       new StreamReader("saying.txt")) 
      { 
       inValue = infil.ReadLine(); 
       while (inValue != null) 
       { 
        inValue = infil.ReadLine(); 
        if (inValue != null) 
         this.lstBxDisplay.Items.Add(inValue); 
       } // end of while 
      } // end of using 
     } 
     catch (System.IO.IOException exc) 
     { 
      lstBxDisplay.Text = exc.Message; 
     } 
    } 

    private void Grades_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     try 
     { 
      fil.Close(); 
     } 
     catch 
     { 

     } 
    } 


} 
} 

ein Grund, warum es nicht in die Listbox geladen wird? Ich habe sowohl Label als auch Textbox ausprobiert, um die Nachricht anzuzeigen, und keiner von beiden funktioniert. Ich debuggte das Programm und es ist in Ordnung

Antwort

0

Sie haben mehrere Probleme hier, aber ich werde zwei Hauptprobleme, die Ihren Code funktionieren.

  1. Sie schließen den Stream nicht, wenn Sie versuchen zu speichern. Wenn der Stream geöffnet bleibt, können Sie die Werte nicht lesen, wenn Sie versuchen, die Datei zu "laden". Sie müssen fil.Close(); am Ende Ihrer btnSaveAs_Click Methode aufrufen.

So sollte die Sicherung gelesen werden.

fil.WriteLine(txtBxLastName.Text); 
    txtBxLastName.Text = ""; 
    txtBxLastName.Focus(); 

    fil.Close(); 
  1. Sie die erste Zeile der Datei in Ihrer "Load" Methode übersprungen werden. Sie rufen infil.ReadLine(); dann in der Schleife, Sie rufen es erneut auf, bevor Sie es zu Ihrer Listbox hinzufügen. Sie müssen Ihre zweite ReadLine() verschieben. Wenn Sie nur eine einzige Zeile in die Datei schreiben, überspringt Ihr vorhandener Code diese erste Zeile und versucht, sie erneut zu lesen, was null ist (keine zweite Zeile). Also, es wird nie etwas zu Ihrer Listbox hinzufügen.

So sollten die Lesevorgänge bestellt werden.

using (StreamReader infil = new StreamReader("saying.txt")) 
    { 
     inValue = infil.ReadLine(); 

     while (inValue != null) 
     { 
      this.lstBxDisplay.Items.Add(inValue); 

      inValue = infil.ReadLine(); 

     } // end of while 
    } // end of using 

Diese Änderungen werden Sie arbeiten. Um nun darauf hinzuweisen, gehen Sie in eine Datei falsch und lesen sie. Sie sollten keinen Stream in Ihrer Formularladung öffnen und darauf warten, dass Schaltflächenklicks aus diesem Stream schreiben/lesen. Sofern Sie nicht einen sehr guten Grund haben, das zu tun, was Sie tun, sollten Sie Ihren Stream öffnen, den Lese-/Schreibvorgang ausführen und Ihren Stream sofort schließen. Für eine einfache Datei-IO würde ich sogar vorschlagen, einen anderen Mechanismus zu verwenden. Sehen Sie sich die MSDN for the System.IO.File Class an, um einfachere Methoden zum Lesen von Zeilen oder Schreiben von Zeilen in eine Datei zu erhalten.

+0

Ich habe das fil.Close(); Teil, bevor Sie den zweiten Teil des Codes erneut gepostet haben, danke für diesen Hinweis. Allerdings versuche ich einen txtBxFirstName mit ihm und alles, was es zeigt, ist der txtBxLastName. Versuchte das fil.Close nach dem txtBxFirstName und vorher und beide – Joe

+0

Bitte beachten Sie Teil 2 für den Grund, dass es nur den 'txtBxLastName' zeigt. Ihr ursprünglicher Code liest gerade (um die erste Zeile zu erhalten) und Sie prüfen auf Null und geben dann Ihre Schleife ein. An diesem Punkt führen Sie einen zweiten Lesevorgang durch, bevor Sie diese erste Zeile zu Ihrer Listbox hinzufügen. Also, Sie überspringen im Wesentlichen Ihre erste Lesung. Sehen Sie, wie ich in der Schleife die Position der 'lstBxDisplay.Items.Add (inValue)' und die 'inValue = infil.ReadLine()' vertauscht habe. – Mikanikal

Verwandte Themen