Hallo,
Ich komme bei einen Notizbuch nicht weiter es eigentlich kompett fertig nur wenn ich das Programm neustarte sind alle Notizen weg.
Nun hab ich mir gedacht okay erstellen wir eine Textdatei und speichern die darin und lesen sie beim start wieder aus.
Leider funktioniert das irgend wie nicht die Textdatei ist bzw. bleibt nämlich leer.
Als Test hab ich schließlich die textdatei mal von Hand beschrieben, dass laden hat leider auch nicht so ganz funktioniert.
Es wurden texte nur geladen wenn ich eine neue Notiz hinzugefügt hab jedoch wurde die neue notiz nun nicht mehr eingetragen, zudem wurde nur eine zeile gelesen bzw. wenn ich noch eine neue notiz erstellt habe wurde die 2 zeile gelesen.
Ich stelle euch mal alles zur verfügung was ich bis jetzt habe ich hoffe irgend wer findet den fehler 😉
GUI KLASSE:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace persoenlichesNotizbuch_V0
{
public partial class NotizbuchForm : Form
{
private Notizbuch notiz;
private int zahl = -1;
private int zahlencounter = 0;
private bool pruefe = false;
public NotizbuchForm()
{
InitializeComponent();
notiz = new Notizbuch();
}
private void speichernButton_Click(object sender, EventArgs e)
{
if (pruefe == false)
{
if (notizTextBox.Text != "")
{
zahl++;
zahlencounter = zahl + 1;
notiz.SpeichereNotiz(zahlencounter.ToString() + ". " + notizTextBox.Text);
notizTextBox.Clear();
}
else
{
MessageBox.Show("Das Eingabefeld darf nicht leer sein!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
if (notizTextBox.Text != null)
{
notiz.bearbeiten(notizTextBox.Text, notizListBox.SelectedIndex);
notizTextBox.Clear();
}
else
{
MessageBox.Show("Das Eingabefeld darf nicht leer sein!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//Speichern in Datei wenn neue Notiz hinzugefügt worden ist
string dateiname = "Notizen.txt";
FileStream datenstrom = new FileStream(dateiname, FileMode.Create, FileAccess.Write);
StreamWriter schreiber = new StreamWriter(datenstrom);
for (int i = 0; i <= zahl; i++)
{
schreiber.WriteLine(notiz.ZeigeNotiz(i));
}
schreiber.Close();
datenstrom.Close();
pruefe = false;
}
}
private void NotizbuchForm_Load(object sender, EventArgs e)
{
// Gespeicherte Notizen Laden
string dateiname = "Notizen.txt";
FileStream datenstrom = new FileStream(dateiname, FileMode.OpenOrCreate, FileAccess.Read);
StreamReader leser = new StreamReader(datenstrom);
while (leser.Peek() != -1)
{
notiz.SpeichereNotiz(leser.ReadLine());
}
leser.Close();
datenstrom.Close();
}
}
}
...
...
Weiter Klasse:
...
...
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace persoenlichesNotizbuch_V0
{
/**
* Die Klasse Notizbuch verwaltet beliebig lange Notizlisten.
* Die Notizen sind nummeriert, um referenziert werden zu können.
* In dieser Version starten die Notiznummern bei 0.
* Autor: Marcel Croonenbroeck
* Version: 03.01.2011
*/
public class Notizbuch
{
// Speicher für eine beliebige Anzahl an Notizen
private ArrayList notizen;
// Führt die Initialisierungen durch, die für ein Notizbuch notwendig sind
public Notizbuch()
{
notizen = new ArrayList();
}
// Speichert eine neue Notiz in diesem Notizbuch
public void SpeichereNotiz(string notiz)
{
notizen.Add(notiz);
}
// Zeigt die Notiz mit der Notiznummer <index> an
public string ZeigeNotiz(int index)
{
if ((index >= 0) && (index < AnzahlNotizen()))
{
return (string)notizen[index];
}
else
{
return "";
}
}
}
}
Real programmers don't comment their code - it was hard to write, it should be hard to understand.
Hallo Crone,
bitte poste das nächste mal nur den relevanten Code.
using (StreamWriter sw = new StreamWriter("CDriveDirs.txt")) { foreach (DirectoryInfo dir in cDirs) { sw.WriteLine(dir.Name); } }
sollte reichen dann brauchst du auch keinen Close(). Wenn du an deinem Beispiel bleibst kannst du vor dem .Close() ein .Flush() probieren.
Lies dir u.a. folgenden Link durch: What is the difference between StreamWriter.Flush() and StreamWriter.Close()?
Gruß
Michael
Wenn ich das richtig verstanden habe müsste es dann so aus sehen.
using (StreamWriter sw = new StreamWriter("Notiz.txt"))
{
for (int i = 0; i <= zahl; i++)
{
foreach (DirectoryInfo dir in )
{
sw.WriteLine(notiz.ZeigeNotiz(i));
}
}
sw.Flush();
}
Jedoch komme ich bei dieser zeile nicht weiter
foreach (DirectoryInfo dir in //was kommt hier hin? )
Real programmers don't comment their code - it was hard to write, it should be hard to understand.
vorerst:
bitte bitte bitte verwende nicht ArrayList. Dies ist nicht mehr erwünscht.
Edit: Verwende dazu die Generische Collection List<String>
nein, du hast doch deine Collection notizen. Evt kannst du die öffentlich zugänglich machen, dann kannst du über
public class Notizbuch
{
public List<String> Notizen{get;set;}
}
Notizbuch nb = new Notizbuch();
nb.Notizen.Add("NewNotiz");
hinzufügen und über folgenden Codeausschnitt schreiben:
using (StreamWriter sw = new StreamWriter("Notiz.txt"))
{
foreach (Datentype n in notiz.notizen)
{
sw.WriteLine(n);
}
}
Ich werfe mal
File.WriteAllText();
File.ReadAllText();
ein. Soweit ich das sehe, kannst du das damit Ersetzen und sparst dir die IO Logik mit dem StreamWriter mit dem Close und Flush.
> Codejunky <
Hallo Crone,
hier kommen meine Bemerkungen:
Wenn eine Ausnahme auftritt, dann wird dein Programm hart beendet. Thema: ExceptionHandling
if (notizTextBox.Text != null)
Er kommt nie in den else-Zweig, da die Eigenschaft immer ungleich null ist. Prüfe bitte auf string.IsNullOrEmpty().
Die Logik ist nicht von der Form getrennt. Sehr schlechtes Design, bzw. überhaupt keins. 🙂
Was passiert, wenn notizListBox.SelectedIndex gleich - 1 ist? X(
Was passiert mit deinem Programm, wenn im OnLoad() sagen wir 1 Mio Notizen geladen werden? X(
-dispose-