2016-10-01 1 views
0

Also ich versuche, einen einfachen Code für Bildungszwecke zu schreiben, der eine Zeichenfolge aus einem Textfeld nimmt und in die TXT-Datei schreibt. Jedes Mal auf die Taste zum zweiten Mal drücken ich diese Fehlermeldung: Error MessageWie zu beheben ObjectDisposedException wurde unbehandelt?

Hier ist der Code:

StreamWriter sw = new StreamWriter("somefile.txt"); 
    private void button1_Click(object sender, EventArgs e) 
      { 
       string textBoxStuff = textBox1.Text; 
       textBox1.Text = ""; 
       using (sw) 
       { 
        sw.WriteLine(textBoxStuff); 
       } 
      } 

Antwort

1

Weil Sie explizit sagen sw nach dem ersten Mal, wenn Sie die Taste drücken, um zu schließen.

  using (sw) 
      { 
       sw.WriteLine(textBoxStuff); 
      } 

Am Ende einer unter Verwendung von() -Anweisung, wird das Objekt verwendet, angeordnet ist. Das ist alles eines using-Anweisung ist wirklich, es ist im Grunde syntaktischer Zucker um die folgenden:

  try 
      { 
       sw.WriteLine(textBoxStuff); 
      } 
      finally 
      { 
       sw.Dispose(); 
      } 

In diesem Fall Ihre Variable sw bleibt im Rahmen und ist noch verfügbar für die zweite Taste drücken, aber Ihr erster Tastendruck hat bereits schloss die Datei, wenn Dispose() aufgerufen wurde. Wenn Sie wirklich beabsichtigen, die Datei für das Leben dieses Formulars offen zu lassen, möchten Sie using hier nicht verwenden, Sie möchten das Objekt an einem geeigneteren Punkt entfernen.

Die andere Option besteht nicht darin, die Datei während der gesamten Lebensdauer Ihres Formulars offen zu halten, sondern sie bei jedem Drücken der Schaltfläche zu öffnen und zu schließen. In diesem Fall würden Sie ein lokales Streamwriter-Objekt erstellen und es in eine using-Anweisung einfügen.

+0

Aufruf ändern kann, so wie man sich ohne ‚mit‘ mein Code aussehen sollte? – user6879072

+0

Was Sie tun würden, ist genau das, was Sie jetzt tun, außer das 'using {' und das zugehörige Schließen '}' loszuwerden. Wahrscheinlich möchten Sie auch eine 'sw.Dispose()' irgendwo hinzufügen, wo Sie wissen, dass Sie den Stream nicht mehr benötigen. – PMV

+0

(Ich fügte der Frage eine zusätzliche Codezeile hinzu, um den Code zu vervollständigen, den ich geschrieben habe) Wenn ich es so mache, schreibt es einfach nichts, und wenn ich manuell 'sw.Dispose(); als bekomme ich beim zweiten Tastendruck das selbe Problem. – user6879072

1

Sie haben wahrscheinlich bereits auf Ihrem Streamwriter genannt woanders entsorgen.

Sie können versuchen, diese (neue Instanz verwenden, die nicht entsorgt wird): Faustregel gilt: Als

private void button1_Click(object sender, EventArgs e) 
{ 
    string textBoxStuff = textBox1.Text; 
    textBox1.Text = ""; 
    using (var streamWriter = /*create your StreamWriter instance somehow*/) 
    { 
     streamWriter.WriteLine(textBoxStuff); 
    } 
} 

Ich habe nicht eine der Klassen Felder in einem mit Block und ich benutze es nur auf lokale Methodenvariablen.
Wenn Sie aus irgendeinem Grund IDisympossable-Feld benötigen und es während aller Klassen lebenslang am Leben erhalten müssen, lasse ich die Klasse IDisympossable implementieren, und in der Dispose-Methode rufe ich die dispsoe-Methode dieses Feldes auf.

-1

Scheck, der Texter auf eine gültige Datei verweisen:

using (TextWriter writer = File.CreateText("C:\\perl.txt")) // Check the file here 
    { 

     writer.WriteLine("First line"); 

    } 

oder

using (TextWriter writer = File.AppendText(path)) // Check the file here 
    { 

     writer.WriteLine("First line"); 

    } 
+0

, die nicht den Fehler OP erzeugen würde, wird immer – MickyD

+0

probebly die Methode der –

0

Ich erhielt dieselbe Fehlermeldung, wenn ich versuchte, ein geschlossenes Formular anzuzeigen.

Hier ist, wie ich das Problem umgehen konnte;

if (myForm.IsDisposed) 
      myForm = new Form(); 
myForm.Show(); 
Verwandte Themen