Entwickler-Ecke
WinForms - Fehler mit der ListView
Csharp-programmierer - Mo 08.06.15 19:09
Titel: Fehler mit der ListView
Hallo Leute. Wenn ich mein Programm starte, dann sollen 2 neue Fenster aufgehen. Einmal das Hauptprogramm und einmal die Karten (Getränke, Speisen, Sonstiges), die ist die Form2. Auf der Form2 befindet sich eine ListView.
Das Programm erstellt automatisch ein Ordner für Speisen, Getränke und Sonstiges. Die ListView für Getränke wird mit den Files aus dem Verzeichnis Getränke befüllt und mit den jeweiligen Bildern, die der Benutzer beim hinzufügen einer neuen Speise laden kann. Wie ich meine Files befülle:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| path = Directory.GetCurrentDirectory() + "\\Speisen\\"; var s = Path.Combine(path + this.textBox1.Text); if (!File.Exists(path)) { File.WriteAllText(path + this.textBox1.Text, this.textBox2.Text); File.AppendAllText(path + this.textBox1.Text, this.textBox3.Text); File.AppendAllText(path + this.textBox1.Text, this.textBox4.Text); File.AppendAllText(path + this.textBox1.Text, this.textBox5.Text); File.AppendAllText(path + this.textBox1.Text, this.textBox6.Text); File.AppendAllText(path + this.textBox1.Text, this.textBox7.Text); } |
Und nun, wie ich die Files in der ListView befülle:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| path = Directory.GetCurrentDirectory() + "\\Speisen\\"; if(!Directory.Exists(path)) { Directory.CreateDirectory(path); }
string[] files = Directory.GetFiles(path);
foreach(string s in files) { using(StreamReader reader = new StreamReader(s)) { ListViewItem item = new ListViewItem(reader.ReadLine()); item.SubItems.Add(reader.ReadLine()); this.listView1.Items.Add(item); } } |
Wenn ich jetzt den Preis, Geschmack, Beschreibung.... in TextBoxen schreibe und dies dann speichere, dann wird alles zusammengewürfelt in der ListView.
z.B.: 1,99SüßLecker
Wie kann ich das machen, das Preis, Geschmack und Beschreibung in die jeweiligen Colums der ListView eingetragen werden?
Wie kann ich es machen, dass die jeweiligen Bilder der Speisen in die Items eingetragen werden?
Mit freundlichen Grüßen, Yannic M. :)
Ralf Jansen - Mo 08.06.15 19:24
Fangen wir mal mit Gegenfragen an.
a.) Warum benutzt du ein ListView? Hat das irgendwelche speziellen Fähigkeiten die du brauchst? Was du beschreibst sind für mich tabellarische Daten und dafür benutzt man am ehesten ein DataGridView.
b.) Directory.GetCurrentDirectory() ist das aktuelle Arbeitsverzeichnis das kann sich zur Laufzeit ändern. Willst du das wirklich? Oder wolltest du nicht eher irgendwie die Daten an einen fixen Ort unterbringen. Je nachdem wie du deine Anwendung startest ist dein Arbeitsverzeichnis ein anderes.
Zur ListView ist schwer zu helfen wenn wir nicht wissen wie das eingestellt ist. Wie sind die Columns definiert? Welchen View hast du verwendet? Details?
Csharp-programmierer - Di 09.06.15 12:51
Ich benutze eine ListView, da ich mich mit einer DataGridView überhaupt nicht auskenne. Ich würde sie aber auch gern kennenlernen ;). Die Einstellung meiner ListView momentag sind die standartmäßigen, da ich dort auch ein Bild einfügen kann.
Ich würde meine Daten gerne an einem Festen Ort (z.B. Desktop) speichern, jedoch weiß ich nicht, wie man das machen kann.
Mit freundlichen Grüßen :)
Ralf Jansen - Di 09.06.15 13:22
| Zitat: |
| Ich benutze eine ListView, da ich mich mit einer DataGridView überhaupt nicht auskenne. Ich würde sie aber auch gern kennenlernen ;). Die Einstellung meiner ListView momentag sind die standardmäßigen, da ich dort auch ein Bild einfügen kann. |
Wenn ich mich richtig an das ListView erinnere bekommst du entweder ein Bild oder eine tabellarische Ansicht aber nicht beides. Bei der tabellarischen Ansicht max ein Icon, wie man es halt aus dem FileExplorer kennt, das ist ein ListView. Ich würde eher das DataGridView empfehlen.
| Zitat: |
| Ich würde meine Daten gerne an einem Festen Ort (z.B. Desktop) speichern, jedoch weiß ich nicht, wie man das machen kann. |
Empfehlung Desktop oder unterhalb der eigenen Anwendung sind ganz schlechte Orte um irgendwas zu speichern. Entweder nervt es den User (Desktop) oder er hat höchst wahrscheinlich nicht die Rechte um dort irgendwas zu schreiben (Unterhalb deiner Anwendung - im Programme Ordner hat man nur eingeschränkte Rechte).
Z.B. um in deinem Dokumente Ordner in einem Unterverzeichnis zu speichern.
C#-Quelltext
1:
| path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "MeinLieberProgrammName"); |
Csharp-programmierer - Di 09.06.15 16:28
Vielen Dank für Ihre hilfreiche Antwort. Haut jetzt soweit hin. Jedoch weiß ich nicht, wie ich der DataGripView etwas hinzufüge und später die Daten daraus auslesen kann. Außerdem werde ich später dann die jeweiligen Daten aus der DataGridView / ListView seperat speichern.*
*= dort stehen die einzelnen Speisen der jeweiligen Tische. Und diese möchte ich speichern können, falls das System abstürzt. Wo würde das dann einfacher gehen?
MFG :)
Ralf Jansen - Di 09.06.15 16:50
Ein DataGridView ist ein Control zum anzeigen du solltest damit keine Logik verbinden. Schreib dein Programm so das die einlesen ändern speichern auch ohne DataGridView oder anderes Control funktionieren würde dann bist du auf dem richtigen Weg.
Ich kann dir nicht sagen wie du das am besten mit dem Code machst den du schon hast. Aber richtig machst du es dann wenn du für deine Speisen eine Klasse schreibst die alle Daten einer Speise enthalten. Damit kann man dann wunderbar arbeiten und nebenbei läßt sich das dann in den meisten Controls wunderbar ohne arbeit anzeigen. Wenn du diese Klasse mit einer Speise in eine Liste wirft dann ist das anzeigen nur noch ein binden der Liste an das Grid etwa
C#-Quelltext
1: 2:
| List<Speisen> speisen = ReadSpeisen(); grid.DataSource = speisen; |
Csharp-programmierer - Di 09.06.15 18:00
Ich habe mir jetzt überlegt, dass man die Files auch ohne dieses .AppenedText lösen kann. Nämlich so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| SaveFileDialog save = new SaveFileDialog(); if(save.ShowDialog() == DialogResult.OK) { path = save.FileName; using(StreamWriter writer = new StreamWriter(path)) { writer.WriteLine(this.textBox1.Text); } } |
Ich möchte dies jedoch machen, ohne den Dialog dabei aufzurufen. Ich wüsste jedoch wie, aber ich weiß nicht, wie ich den Dateinamen (also das im SaveFileDialog, wo man den Dateinamen eingibt) dort einbinden kann, ohne den Dialog aufzurufen.
Zu Ihrer Antwort:
Könnten Sie mir nun vielleicht eine Antwort geben, wie man ein Klasse schreibt, die die Methode beinhaltet, um die Liste Karte zu befüllen?
MFG :D
Ralf Jansen - Di 09.06.15 18:52
| Zitat: |
| Ich wüsste jedoch wie, aber ich weiß nicht, wie ich den Dateinamen (also das im SaveFileDialog, wo man den Dateinamen eingibt) dort einbinden kann, ohne den Dialog aufzurufen. |
Du möchtest das der User nur einen Dateinamen eingeben kann kein Pfad etc. ? Dann schreib dir doch einen kleinen Dialog mit nur einer TextBox (und vielleicht einem Label) zum eingeben des Namens drauf das ist eine gute Übung und schnell gemacht ;)
| Zitat: |
| Könnten Sie mir nun vielleicht eine Antwort geben, wie man ein Klasse schreibt, die die Methode beinhaltet, um die Liste Karte zu befüllen? |
Da ich nicht weiß was eine Liste Karte ist nein.
Delete - Di 09.06.15 21:57
- Nachträglich durch die Entwickler-Ecke gelöscht -
Csharp-programmierer - Mi 10.06.15 15:41
Das haut jetzt hin. Vielen Dank an meine Mithelfer. Super nett von euch :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!