Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mo 08.06.15 19:09 
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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "MeinLieberProgrammName");					
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden C#-Quelltext
1:
2:
List<Speisen> speisen = ReadSpeisen(); // irgendeine Methode die die Daten lädt
grid.DataSource = speisen;
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 09.06.15 21:57 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 10.06.15 15:41 
Das haut jetzt hin. Vielen Dank an meine Mithelfer. Super nett von euch :)