Entwickler-Ecke

WinForms - Listbox speichern, löschen, einlesen


matze94 - Fr 17.09.10 19:46
Titel: Listbox speichern, löschen, einlesen
ich hab einen vb code zu diesen funktionen gefunden und in c# über setzt blos funktioniert es nicht. es kommt beim löschen und beim einlesen die fehlermeldung:
"Die Items-Auflistung kann nicht geändert werden, wenn die DataSource-Eigenschaft festgelegt ist."

hier ist mal der entsprechende ausschnitt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
        public void ListBox_Save(ListBox ListBox, string sFile)
        {

            // Inhalt einer ListBox speichern
            System.IO.StreamWriter oStream = null;
            short i = 0;

            oStream = new System.IO.StreamWriter(sFile);

            for (i = 0; i <= ListBox.Items.Count - 1; i++)
            {
                oStream.WriteLine(ListBox.Items);
            }
            oStream.Close();
        }

        public void ListBox_Read(ListBox ListBox, string sFile)
        {

            // Inhalt einer ListBox speichern
            System.IO.StreamReader oStream = null;
            string sLine = null;

            // ListBox löschen
            ListBox.Items.Clear();
                      
            // Existsiert die Datei?
            System.IO.FileInfo oFile = new System.IO.FileInfo(sFile);

            if (oFile.Exists == true)
            {
                oStream = new System.IO.StreamReader(sFile);
                // Datei zeilenweise auslesen
                do
                {
                    sLine = oStream.ReadLine();
                    if ((sLine == null))
                        break// TODO: might not be correct. Was : Exit Do
                    ListBox.Items.Add(sLine);
                } while (true);
                oStream.Close();
            }
        }

        private void button12_Click(object sender, EventArgs e)
        {
      // ListBox speichern
      string sFile = null;

      sFile = Application.StartupPath + "\\Liste.dat";
        ListBox_Save(listBox1, sFile);
        }

        private void button13_Click(object sender, EventArgs e)
        {
            // Inhalt der ListBox löschen
            ListBox.Items.Clear();
        }

        private void button14_Click(object sender, EventArgs e)
        {
            // ListBox einlesen
            string sFile = null;
            sFile = Application.StartupPath + "\\Liste.dat";
            ListBox_Read(listBox1, sFile);
        }



Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 17.09.2010 um 19:48


Yogu - Fr 17.09.10 20:34

Schau mal im Eigenschaftsfenster, ob die DataSource-Eigenschaft tatsächlich festgelegt ist. Ist dem so, solltest du den Verweis entfernen. Natürlich darf auch nirgends im Code die Eigenschaft gesetzt werden.


matze94 - Sa 18.09.10 14:05

danke die funktion die einträge in die listbox erstellt hat, bzw. die die sie entfernt hat hatten eine data source eigenschaft ich hab die funktionen rausgelassen, auch aus anderen grund


Yogu - Sa 18.09.10 17:01

Ist das Problem jetzt gelöst oder nicht? :gruebel:

Wenn nicht, hast du wirklich alle Verweise auf DataSource entfernt? Benutze sicherheitshalber mal die Suche in Dateien von Visual Studio.


matze94 - Sa 18.09.10 17:32

das einlesen von eigenen dateien klappt

das löschen bedingt, d.h. nicht mit eingelesen itemen, liegts vielleicht am code?

C#-Quelltext
1:
listBox1.DataSource = null;                    

somit konnte ich das data sourche problem umgehen

das einzige problem ist das speichern, es erzeugt zwar eine datei doch steht nur
Zitat:
System.Windows.Forms.ListBox+ObjectCollection

drin und zwar so viel mal wie iteme in der list box sind also sind drei iteme drinnen speichert er dreimal diesen code

hier mal der code ders speichern soll


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
            // ListBox speichern
            //string sFile = null;
            string sFile = Application.StartupPath + "\\Liste.xml";
            //ListBox_Save(listBox1, sFile);
            // Inhalt einer ListBox speichern
            System.IO.StreamWriter oStream = null;
            int i = 0;

            oStream = new System.IO.StreamWriter(sFile);
            
            while(i < listBox1.Items.Count)
            {
                oStream.WriteLine(listBox1.Items[i]);
                i = i + 1 ;
            }
            oStream.Close();


Yogu - Sa 18.09.10 18:28

user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
das einlesen von eigenen dateien klappt

das löschen bedingt, d.h. nicht mit eingelesen itemen, liegts vielleicht am code?

C#-Quelltext
1:
listBox1.DataSource = null;                    

somit konnte ich das data sourche problem umgehen

Naja - brauchst du jetzt eine DataSource oder nicht? Wenn du keine brauchst, solltest du einfach alles, was mit ihr zu tun hat, löschen. Sonst solltest du mit der Datenquelle anstatt der ListBox arbeiten.

user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:
das einzige problem ist das speichern, es erzeugt zwar eine datei doch steht nur
Zitat:
System.Windows.Forms.ListBox+ObjectCollection

drin und zwar so viel mal wie iteme in der list box sind also sind drei iteme drinnen speichert er dreimal diesen code

hier mal der code ders speichern soll

Das war zwar nicht der richtige, aber oben hast du ihn ja gepostet ;)

Der Fehler dort ist mir vorher noch gar nicht aufgefallen:
user profile iconmatze94 hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
 
10:
11:
12:
13:
/* ... */
            for (i = 0; i <= ListBox.Items.Count - 1; i++)
            {
                oStream.WriteLine(ListBox.Items);
            }

Muss natürlich ListBox.Items[i] heißen.


matze94 - Sa 18.09.10 18:56

ich hab jetzt den code oben ausgetauscht (in richtiger fassung) und er funktioniert, so wie ich es will!
vielen dank, tolles forum


CityHunter - So 29.04.12 14:04

Hallo,

ich arbeite an sowas gleiches leider kriege ich das nicht hin es in einer XML datei die Werte aus der ListBox zu speichern.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
void ListeSpeichern()
        {            
            // den Dateinamen aus dem Pfad zusammenbauen
            xmlDateiname = System.IO.Path.ChangeExtension(Application.ExecutablePath, ".xml");
            // Pürfen, ob es die Datei bereits gibt
            xmlVorhanden = System.IO.File.Exists(xmlDateiname);
            // die Einstellungen setzen
            XmlWriterSettings einstellungen = new XmlWriterSettings();
            einstellungen.Indent = true;
            // eine Instanz für XmlWriter erzeugen
            XmlWriter xmlSchreiben = XmlWriter.Create(xmlDateiname, einstellungen);
            // die Deklaration schreiben
            xmlSchreiben.WriteStartDocument();
            // den Wurzelknoten bestenliste erzeugen
            xmlSchreiben.WriteStartElement("ListenBox");
            // ListBox Anzahl
            for (int i = 0; i < listBox1.Items.Count - 1; i++)
            {
                // den Knoten eintrag erzeugen
                xmlSchreiben.WriteStartElement("eintrag");
                // die Einträge schreiben
                xmlSchreiben.WriteElementString("Eingabefeld",listBox1.SelectedItems.ToString());
                // den Knoten abschließen
                xmlSchreiben.WriteEndElement();
            }

            // alle abschließen
            xmlSchreiben.WriteEndDocument();
            // Datei schließen
            xmlSchreiben.Close();
            
        }


Hoffe mir kann da einer weiter helfen.

Wünsche euch ein schönen Feiertag.


Th69 - So 29.04.12 20:22

Hallo CityHunter :welcome:

hast du auch die markierte Anmerkung von Yogu hier in diesem Beitrag gelesen?

P.S: Beim nächsten Mal eröffne besser einen eigenen Beitrag (und verweise evtl. auf einen anderen), damit sich die Antworten nicht vermischen.


CityHunter - So 29.04.12 20:52

Ja habe ich. Naja jedes mal wenn ich irgend wo im Forum was neues aufmache wird es gelöscht weil das schon gibt in einer abgewanden Form. Ja habe das mit [i] Probiert aber keine ahnung vielleicht habe ich ja auch ein Logik fehler drin. Die sind ja bissel schwerer zufinden als ein Syntax fehler ^^

Moderiert von user profile iconTh69: Full-Quote entfernt.


Yogu - Mo 30.04.12 13:06

Was mir noch auffällt ist, dass du das Element "ListenBox" öffnest (Zeile 15), aber nicht schließst (sollte vor WriteEndDocument passieren). Wenn das auch nicht hilft, solltest du uns auf jeden Fall sagen, was genau nicht funktioniert (Compilerfehler? Exception? Unerwartetes Verhalten?)