none
listBox Einträge zur Laufzeit speichern und evtl. wieder einlesen RRS feed

  • Frage

  • Hallo Community,

    ich wüßte gerne, wie man in C# listBox Einträge speichert und eventuell auch einliest?.

    Das vorherige editieren der listBox mittels LstMeineListe.Items.Add("bla"); ist mir schon bekannt.

    Aber wie stelle ich das an, dass ich dies wärend der Laufzeit speichern kann?

    MfG MichlFwR

    Danke im Voraus.

    Sonntag, 17. März 2019 15:41

Antworten

  • Hi Michl,
    hier mal eine ganz einfache Demo zu Deinem Ziel:

    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form02 : Form
      {
        public Form02()
        {
          InitializeComponent();
          this.Load += new System.EventHandler(this.Form02_Load);
        }
    
        // Arbeit ohne Designer in einer leeren Form
        private Button btnLoad = new Button() { Text = "Laden", Dock = DockStyle.Top };
        private Button btnAdd = new Button() { Text = "Hinzufügen", Dock = DockStyle.Top };
        private Button btnSave = new Button() { Text = "Speichern", Dock = DockStyle.Top };
        private ListBox lb = new ListBox() { Dock = DockStyle.Top };
        private string fileName = @"Form02Demo.txt";
    
        private void Form02_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { lb, btnSave, btnAdd, btnLoad });
          btnLoad.Click += BtnLoad_Click;
          btnAdd.Click += BtnAdd_Click;
          btnSave.Click += BtnSave_Click;
        }
    
        private void BtnLoad_Click(object sender, EventArgs e)
        {
          if (File.Exists(fileName))
          {
            // alten Inhalt der ListBox löschen
            lb.Items.Clear();
            // Reader initialisieren
            // Schleife, solange Daten noch einzulesen sind
            // Zeile einlesen und der Liste in der Listbox hinzufügen
            // Reader schließen und entsorgen (beim Ende von Using)
            using (StreamReader rdr = new StreamReader(fileName))
              while (!rdr.EndOfStream) lb.Items.Add(rdr.ReadLine());
          }
        }
    
        private void BtnAdd_Click(object sender, EventArgs e)
        {
          // zur Demo die akteuelle Zeit als eine neue Zeile hinzufügen
          lb.Items.Add(DateTime.Now.ToLongTimeString());
        }
    
        private void  BtnSave_Click(object sender, EventArgs e)
        {
          // Writer initialisieren
          // Schleife über alle Elemente in der Liste der ListBox
          // zeilenweise in Datei ausgeben
          // Writer schließen und entsorgen
          using (StreamWriter wrt = new StreamWriter(fileName))
            foreach (var item in lb.Items) wrt.WriteLine(item);
        }
      }
    }


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 21. März 2019 05:28

Alle Antworten

  • Hi Michl,
    eine einfache Lösung ist das Verwalten der Daten in einer Liste im Programm. Die Liste wird gefüllt, indem die Daten aus einer Datei eingelesen werden. Die Liste wird als Datenquelle (DataSource) an die ListBox gebunden. Nach der Arbeit des Programmes wird der Inhalt der Liste wieder in eine Datei gespeichert. Neue Elemete werden nicht direkt der ListBox hinzugefügt, sondern der Liste. Damit wird wegen der Bindung auch die Anzeige in der ListBox aktualisiert. Jedes Datenobjekt in der Liste kann entweder einfach nur eine Zeichenkette sein, oder auch ein komplexes Objekt mit mehreren Eigenschaften wie beispielsweise Nummer und Anzeige-Zeichenkette. Für die Ablage in der Datei gibt es auch verschiedene Möglichkeiten, z.B. eine einfache Textdatei, eine XML-Datei, eine Json-Datei, eine Binärdatei.

    Für eine kleine Demo wäre noch wichtig, um welchen Projekttyp es sich handelt (WPF, …), welche konkrete Ablageform in der Datei geplant ist, wie die einzelnen Datenelemente bearbeitet werden sollen (neu, ändern löschen).


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Sonntag, 17. März 2019 18:36
  • Hi Peter,

    Danke erstmal für die Antwort.

    Es handelt sich fürs erste nur um eine Windows-Form-App und als Ablage würde fürs erste eine Textdatei reichen. In meinem Anfängerbuch wird zwar beschrieben, wie man die listBox zur Entwicklungszeit füllt, aber nicht in der Laufzeit.

    Ich beschäftigte mich erst seit kurzem mit C#. Natürlich denke ich, wäre eine Datenbank viel besser, aber soweit rauszuschwimmen traue ich mich noch nicht;)

    Mittwoch, 20. März 2019 20:59
  • Hi Michl,
    hier mal eine ganz einfache Demo zu Deinem Ziel:

    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form02 : Form
      {
        public Form02()
        {
          InitializeComponent();
          this.Load += new System.EventHandler(this.Form02_Load);
        }
    
        // Arbeit ohne Designer in einer leeren Form
        private Button btnLoad = new Button() { Text = "Laden", Dock = DockStyle.Top };
        private Button btnAdd = new Button() { Text = "Hinzufügen", Dock = DockStyle.Top };
        private Button btnSave = new Button() { Text = "Speichern", Dock = DockStyle.Top };
        private ListBox lb = new ListBox() { Dock = DockStyle.Top };
        private string fileName = @"Form02Demo.txt";
    
        private void Form02_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { lb, btnSave, btnAdd, btnLoad });
          btnLoad.Click += BtnLoad_Click;
          btnAdd.Click += BtnAdd_Click;
          btnSave.Click += BtnSave_Click;
        }
    
        private void BtnLoad_Click(object sender, EventArgs e)
        {
          if (File.Exists(fileName))
          {
            // alten Inhalt der ListBox löschen
            lb.Items.Clear();
            // Reader initialisieren
            // Schleife, solange Daten noch einzulesen sind
            // Zeile einlesen und der Liste in der Listbox hinzufügen
            // Reader schließen und entsorgen (beim Ende von Using)
            using (StreamReader rdr = new StreamReader(fileName))
              while (!rdr.EndOfStream) lb.Items.Add(rdr.ReadLine());
          }
        }
    
        private void BtnAdd_Click(object sender, EventArgs e)
        {
          // zur Demo die akteuelle Zeit als eine neue Zeile hinzufügen
          lb.Items.Add(DateTime.Now.ToLongTimeString());
        }
    
        private void  BtnSave_Click(object sender, EventArgs e)
        {
          // Writer initialisieren
          // Schleife über alle Elemente in der Liste der ListBox
          // zeilenweise in Datei ausgeben
          // Writer schließen und entsorgen
          using (StreamWriter wrt = new StreamWriter(fileName))
            foreach (var item in lb.Items) wrt.WriteLine(item);
        }
      }
    }


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 21. März 2019 05:28