Zum Inhalt springen
  • 0

Speichern von ListView in .txt datei


Kackboon

Frage

Hallo Leute

Ich schreibe zur Zeit an einem Programm kleinen Programm, welches Eingaben in eine ListView speichert. Jetzt wollte ich gerne diese Einträge von der ListView in ein .txt Dokument abspeichern. Leider funktioniert das nur mäßig. Aktuell speichert er leider nur die ersten drei Werte von fünf. Die Werte sind alle als String deklariert.

Hier der Code:

Das ist das Objekt Fehlermeldungen

namespace Drucker_Fehlermeldung_WF
{
    public class Fehlermeldungen
    {
        public string Name { get; set; }
        public string Gerät { get; set; }
        public string Datum { get; set; }
        public string Uhrzeit { get; set; }
        public string Fehlermeldung { get; set; }

        public Fehlermeldungen(string Name, string Gerät, string Datum, string Uhrzeit, string Fehlermeldung)
        {
            this.Name = Name;
            this.Gerät = Gerät;
            this.Datum = Datum;
            this.Uhrzeit = Uhrzeit;
            this.Fehlermeldung = Fehlermeldung;
        }

        
    }
}

hier füge ich die Eingaben dem listView hinzu:

namespace Drucker_Fehlermeldung_WF
{
    public class hinzufügen    
    {
        public void add()
        {
            Fehlermeldungen f1 = new Fehlermeldungen(textBox4.Text, comboBox2.Text, dateTimePicker4.Text, dateTimePicker3.Text, textBox2.Text);

            ListViewItem lvi = new ListViewItem();
            lvi.Text = f1.Name;
            lvi.SubItems.Add(f1.Gerät);
            lvi.SubItems.Add(f1.Datum);
            lvi.SubItems.Add(f1.Uhrzeit);
            lvi.SubItems.Add(f1.Fehlermeldung);

            listView1.Items.Add(lvi);

            textBox4.Clear();
            textBox2.Clear();
        }
    }
}

und das hier ist der Hauptcode:

namespace Drucker_Fehlermeldung_WF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Fehlermeldungen f1 = new Fehlermeldungen(textBox4.Text,comboBox2.Text, dateTimePicker4.Text, dateTimePicker3.Text, textBox2.Text);

            ListViewItem lvi = new ListViewItem();
            lvi.Text = f1.Name;
            lvi.SubItems.Add(f1.Gerät);
            lvi.SubItems.Add(f1.Datum);
            lvi.SubItems.Add(f1.Uhrzeit);
            lvi.SubItems.Add(f1.Fehlermeldung);

            listView1.Items.Add(lvi);

            textBox4.Clear();
            textBox2.Clear();

        }


        public void button3_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd1 = new SaveFileDialog();
            string filename = "";
            sfd1.Title = "speichere Liste";
            sfd1.Filter = "text files (*.txt)|*.txt|All files (*.*)|*.*|doc files (*.doc)|*.doc";
            //sfd1.FilterIndex = 2;
            sfd1.RestoreDirectory = true;                      
            sfd1.OverwritePrompt = true;
            sfd1.ShowDialog();

            if (sfd1.ShowDialog() == DialogResult.OK)
            {
                filename = sfd1.FileName.ToString();
                if (filename != "")
                {
                    using (StreamWriter sw = new StreamWriter(filename)) 
                    {
                        foreach (ListViewItem item in listView1.Items)
                        {
                            sw.WriteLine("{0}{1}{2}{3}{4}", item.SubItems[0].Text, "/" , item.SubItems[1].Text, "/" , item.SubItems[2].Text, "/", item.SubItems[3].Text, "/", item.SubItems[4].Text);
                        }
                    }
                }
                
                //saveandload s1 = new saveandload();
                //s1.save();             
            
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd1 = new OpenFileDialog();
            ofd1.Filter = "Text Files(*.txt)|*.txt | all files(*.*)|*.*";
            if (ofd1.ShowDialog() == DialogResult.OK)
            {
                listView1.Items.Clear();

                string filename = ofd1.FileName;
                StreamReader sr = new StreamReader(filename);
                string filecontent = sr.ReadToEnd();
                string[] fileitems = filecontent.Split('/');
                sr.Dispose();

                ListViewItem lvi2 = new ListViewItem();
                lvi2.Text = fileitems[0];
                lvi2.SubItems.Add(fileitems[1].ToString());
                lvi2.SubItems.Add(fileitems[2].ToString());
                lvi2.SubItems.Add(fileitems[3].ToString());
                lvi2.SubItems.Add(fileitems[4].ToString());

                listView1.Items.Add(lvi2);                 
                

               
            }
        }
    }
}

So sieht das Programm optisch aus:

druckerprog.thumb.png.25f099bc6790ef983fd3a2b6c0efcd9c.png

und das hier ist das Ergebnis beim speichern:

"Hanswurst/Netzdrucker 2. OG/18.04.2018"

Leider fehlen hier die Angaben "Datum" , "Uhrzeit" und "Fehlermeldung"... Kann mir jemand sagen woran das liegt ???

Zusätzlich ist es auch merkwürdig, dass ich beim Speichern aufgefordert werde einen Dateinamen anzugeben für die .txt Datei. Sobald ich dann auf "speichern" drücke" schließt er den safefiledialog und öffnet ihn direkt wieder, nun allerdings mit dem Pfad als Dateiname... gehört das so?

 

Danke schon einmal im Voraus. Hoffe ich habe das Problem ausreichend beschrieben. Falls noch Fragen sind bitte gerne stellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

20 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
vor 25 Minuten schrieb Kackboon:

Leider fehlen hier die Angaben "Datum" , "Uhrzeit" und "Fehlermeldung"... Kann mir jemand sagen woran das liegt ???

Schaue dir doch mal die Zeile genauer an:

sw.WriteLine("{0}{1}{2}{3}{4}", 
item.SubItems[0].Text, // <- {0}
"/" , // <- {1}
item.SubItems[1].Text,// <- {2} 
"/" , // <- {3}
item.SubItems[2].Text, // <- {4}
"/", 
item.SubItems[3].Text, 
"/", 
item.SubItems[4].Text);

Schreib es doch so:

sw.WriteLine("{0}/{1}/{2}/{3}/{4}", item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text, item.SubItems[4].Text);

 

 

vor 26 Minuten schrieb Kackboon:

Zusätzlich ist es auch merkwürdig, dass ich beim Speichern aufgefordert werde einen Dateinamen anzugeben für die .txt Datei. Sobald ich dann auf "speichern" drücke" schließt er den safefiledialog und öffnet ihn direkt wieder, nun allerdings mit dem Pfad als Dateiname... gehört das so?

Du öffnest den Dialog zwei Mal:

 sfd1.ShowDialog(); // <- 1. Mal

if (sfd1.ShowDialog() == DialogResult.OK) // 2.Mal

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1
vor 1 Stunde schrieb Kackboon:

Wie füge ich denn so eine Referenz hinzu ? Habe das noch nie gemacht.

An der Stelle sind wir wieder an einem Punkt, wo es leider nichts hilft, als das zu tun, was @Whiz-zarD vorschlägt: Setz' dich bitte mit den Grundlagen der Programmierung auseinander. Auch wenn du jetzt "nur mal schnell" das "zum Laufen" bekommen möchtest, tust du dir selber (und möglichen Nachfolgern / Nutzern) keinen Gefallen damit, diese Dinge zusammenzukopieren ohne zu verstehen, worum es eigentlich geht. (Auch wenn einem dann hier im Forum oft vorgeworfen wird, man sei nicht bereit, einfache Fragen zu beantworten - es ist einfach nicht sinnvoll, jemandem auf diese Art zu helfen. Wie man am Downvote zu @Whiz-zarDs Antwort ja schon sehen kann.)

Es ist auch tatsächlich so, dass einem das Programmieren mehr Spaß  macht, wenn man nicht laufend an solchen Formalitäten hängenbleibt, sondern sich um die eigentlichen Funktionen kümmern kann. Ich habe das Gefühl, dass du im Augenblick noch sehr enthusiastisch bist, was die Programmierung angeht, befürchte aber, dass das schnell umschlägt, wenn du mal etwas komplexeres probierst und dann nicht mehr durchsteigst, weil dir die Grundlagen fehlen.

Ich kenne die Tutorials nicht, die verlinkt wurden, aber die dauern ja nur rund 5-6 Stunden. Das ist in einer Woche nach Feierabend oder einem Wochenende gut zu schaffen - und danach wird dir vieles sicher leichter fallen.

Bearbeitet von arlegermi
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 28 Minuten schrieb Whiz-zarD:

Schaue dir doch mal die Zeile genauer an:


sw.WriteLine("{0}{1}{2}{3}{4}", 
item.SubItems[0].Text, // <- {0}
"/" , // <- {1}
item.SubItems[1].Text,// <- {2} 
"/" , // <- {3}
item.SubItems[2].Text, // <- {4}
"/", 
item.SubItems[3].Text, 
"/", 
item.SubItems[4].Text);

Schreib es doch so:


sw.WriteLine("{0}/{1}/{2}/{3}/{4}", item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text, item.SubItems[4].Text);

 

 

Du öffnest den Dialog zwei Mal:


 sfd1.ShowDialog(); // <- 1. Mal

if (sfd1.ShowDialog() == DialogResult.OK) // 2.Mal

 

@Whiz-zarD

hatte nicht realisiert, dass die Platzhalter auch dazu zählen ^^ Danke für den Hinweis! Jetzt läuft es einwandfrei :) 

Ich überleg gerade ob es eine Methode gibt die Daten der zuletzt verwendeten Liste (Im Programm) automatisch beim starten des Programms einzuladen. (Ungern möchte ich beim starten des Programms die letzte Liste manuell auswählen und laden)

Jemand eine Idee ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 14 Minuten schrieb Kackboon:

Ich überleg gerade ob es eine Methode gibt die Daten der zuletzt verwendeten Liste (Im Programm) automatisch beim starten des Programms einzuladen. (Ungern möchte ich beim starten des Programms die letzte Liste manuell auswählen und laden)

Natürlich geht das. Dies lässt sich ja z.B. über das Load Event steuern.
Dafür müssen die Daten in einer persistierten Form vorliegen (z.B. die Textdatei), die dann eingelesen wird.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 2 Stunden schrieb Whiz-zarD:

Natürlich geht das. Dies lässt sich ja z.B. über das Load Event steuern.
Dafür müssen die Daten in einer persistierten Form vorliegen (z.B. die Textdatei), die dann eingelesen wird.

 

 

Ja daran hatte ich auch gedacht, nur hatte ich mich gefragt wie ich die Daten einlese ohne eine openfiledialog zu nutzen. Letztendlich sieht es bei mir nun so aus:

private void Form1_Load(object sender, EventArgs e)
        {
            StreamReader sr2 = new StreamReader(@"C:\Users\NAME\Desktop\Inhalt.txt");
            string filecontent = sr2.ReadToEnd();
            string[] fileitems = filecontent.Split('/');
            string[] filerows = filecontent.Split('+');
            sr2.Dispose();

            ListViewItem lvi3 = new ListViewItem();
            lvi3.Text = fileitems[0];
            lvi3.SubItems.Add(fileitems[1].ToString());
            lvi3.SubItems.Add(fileitems[2].ToString());
            lvi3.SubItems.Add(fileitems[3].ToString());
            lvi3.SubItems.Add(fileitems[4].ToString());

            listView1.Items.Add(lvi3);
        }

Problem an der Sache ist, dass er in der Liste nun die Items/Subitems pro spalte einträgt - allerdings nicht die nächste reihe anfängt. Stattdessen sieht das so aus:

fehler.thumb.png.7e3eeef9d22366d89f8e5118427241c3.png

Das Blaue ist bereits der nächste Datensatz. Davon zeigt er allerdings nur den Namen an und wie gesagt nicht in der nächsten Reihe.

Muss ich da einfach eine 2te Instanz des ListViewItems anlegen? Falls ja woher weiß er wann ein Datensatz endet und wann ein neuer beginnt ? Als ich das versucht habe hat er zwar eine zweite Reihe gemacht, allerdings mit den Daten des ersten Datensatzes..

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 1 Stunde schrieb Kackboon:

Ja daran hatte ich auch gedacht, nur hatte ich mich gefragt wie ich die Daten einlese ohne eine openfiledialog zu nutzen.

Eine Überlegung wäre, eine Konfigurationsdatei (oder ein Registryeintrag) anzulegen, in der der Name der zuletzt gespeicherten Datei eingetragen wird. Diese Konfigurationsdatei (oder ein Registryeintrag) muss der Software zur Entwicklungszeit bekanntgegeben und dann während der Ausführung eingelesen werden. Dann kennt die Software, welche Datei eingelesen werden soll.

vor 1 Stunde schrieb Kackboon:

Problem an der Sache ist, dass er in der Liste nun die Items/Subitems pro spalte einträgt - allerdings nicht die nächste reihe anfängt. Stattdessen sieht das so aus:

Schaue dir doch mal über den Debugger an, was in fileitems drinnensteht. Du wirst sehen, dass für die Fehlermeldung "Fehlermeldung1Name2" stehen wird, weil der String nur über das /-Zeichen gesplittet wird. filerows hingegen hat überhaupt keine Bedeutung, weil es nirgends verwendet wird.

vor 1 Stunde schrieb Kackboon:

Muss ich da einfach eine 2te Instanz des ListViewItems anlegen? Falls ja woher weiß er wann ein Datensatz endet und wann ein neuer beginnt ? Als ich das versucht habe hat er zwar eine zweite Reihe gemacht, allerdings mit den Daten des ersten Datensatzes..

Pro Zeile brauchst du ein ListViewItem. 
Woher er weiß, dass ein Datensatz in einer Datei endet, musst du ihn schon mitteilen.

Und kennst du Schleifen?

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 10 Minuten schrieb Whiz-zarD:

filerows hingegen hat überhaupt keine Bedeutung, weil es nirgends verwendet wird.

Das mit den filerows war nur ein versuch. Hab ich mittlerweile wieder heraus genommen.

vor 10 Minuten schrieb Whiz-zarD:

Schaue dir doch mal über den Debugger an, was in fileitems drinnensteht. Du wirst sehen, dass für die Fehlermeldung "Fehlermeldung1Name2" stehen wird, weil der String nur über das /-Zeichen gesplittet wird.

Genau. Mein erste Gedanke war einfach der hier:

using (StreamWriter sw = new StreamWriter(filename)) 
                    {
                        foreach (ListViewItem item in listView1.Items)
                        {
                            sw.WriteLine("{0}/{1}/{2}/{3}/{4}/", item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text, item.SubItems[4].Text);
                        }
                    }

da habe ich einfach ein "/" hinter der {4} gemacht damit er erkennt, dass ab dort ein neuer Datensatz beginnt. Nur gibt es danach keine column mehr. Hatte gehofft dass er dann automatisch die nächste row nimmt.

Das scheint aber nicht so einfach zu funktionieren

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Funktioniert mittlerweile. Habe einfach ein neues ListViewItem eingefügt und die zahlen angepasst. Aber das geht bestimmt auch ohne dass ich 99x den selben Code einfügen muss (siehe unten), oder ?

Darüberhinaus möchte ich, dass er beim Laden der Form1 - nachdem er die Werte in die Liste eingetragen hat - eine IF-Bedingung ausführt (siehe code). Und zwar soll er in jedem ListViewItem prüfen, ob das "Datum"-Feld mehr als 3 Tage in der Vergangenheit liegt. Ist das der Fall soll die ganze Reihe (das entsprechende ListViewItem) auf die Hintergrundfarbe Orange geändert werden.

Hier der Code:

private void Form1_Load(object sender, EventArgs e)
        {
           
            StreamReader sr2 = new StreamReader(@"C:\Fehlermeldung Drucker\Inhalt.txt");
            string filecontent = sr2.ReadToEnd();
            string[] fileitems = filecontent.Split('/');
            //string[] filerows = filecontent.Split('+');
            sr2.Dispose();

            ListViewItem lvi3 = new ListViewItem();
            lvi3.Text = fileitems[0];
            lvi3.SubItems.Add(fileitems[1].ToString());
            lvi3.SubItems.Add(fileitems[2].ToString());
            lvi3.SubItems.Add(fileitems[3].ToString());
            lvi3.SubItems.Add(fileitems[4].ToString());

            listView1.Items.Add(lvi3);

            ListViewItem lvi4 = new ListViewItem();
            lvi4.Text = fileitems[5];
            lvi4.SubItems.Add(fileitems[6].ToString());
            lvi4.SubItems.Add(fileitems[7].ToString());
            lvi4.SubItems.Add(fileitems[8].ToString());
            lvi4.SubItems.Add(fileitems[9].ToString());

            listView1.Items.Add(lvi4);

            ListViewItem lvi5 = new ListViewItem();
            lvi5.Text = fileitems[10];
            lvi5.SubItems.Add(fileitems[11].ToString());
            lvi5.SubItems.Add(fileitems[12].ToString());
            lvi5.SubItems.Add(fileitems[13].ToString());
            lvi5.SubItems.Add(fileitems[14].ToString());

            listView1.Items.Add(lvi5);

            ListViewItem lvi6 = new ListViewItem();
            lvi6.Text = fileitems[15];
            lvi6.SubItems.Add(fileitems[16].ToString());
            lvi6.SubItems.Add(fileitems[17].ToString());
            lvi6.SubItems.Add(fileitems[18].ToString());
            lvi6.SubItems.Add(fileitems[19].ToString());

            listView1.Items.Add(lvi6);

            ListViewItem lvi7 = new ListViewItem();
            lvi7.Text = fileitems[20];
            lvi7.SubItems.Add(fileitems[21].ToString());
            lvi7.SubItems.Add(fileitems[22].ToString());
            lvi7.SubItems.Add(fileitems[23].ToString());
            lvi7.SubItems.Add(fileitems[24].ToString());

            listView1.Items.Add(lvi7);

            ListViewItem lvi8 = new ListViewItem();
            lvi8.Text = fileitems[25];
            lvi8.SubItems.Add(fileitems[26].ToString());
            lvi8.SubItems.Add(fileitems[27].ToString());
            lvi8.SubItems.Add(fileitems[28].ToString());
            lvi8.SubItems.Add(fileitems[29].ToString());

            listView1.Items.Add(lvi8);

            ListViewItem lvi9 = new ListViewItem();
            lvi9.Text = fileitems[30];
            lvi9.SubItems.Add(fileitems[31].ToString());
            lvi9.SubItems.Add(fileitems[32].ToString());
            lvi9.SubItems.Add(fileitems[33].ToString());
            lvi9.SubItems.Add(fileitems[34].ToString());

            listView1.Items.Add(lvi9);

            ListViewItem lvi10 = new ListViewItem();
            lvi10.Text = fileitems[35];
            lvi10.SubItems.Add(fileitems[36].ToString());
            lvi10.SubItems.Add(fileitems[37].ToString());
            lvi10.SubItems.Add(fileitems[38].ToString());
            lvi10.SubItems.Add(fileitems[39].ToString());

            listView1.Items.Add(lvi10);

            ListViewItem lvi11 = new ListViewItem();
            lvi11.Text = fileitems[40];
            lvi11.SubItems.Add(fileitems[41].ToString());
            lvi11.SubItems.Add(fileitems[42].ToString());
            lvi11.SubItems.Add(fileitems[43].ToString());
            lvi11.SubItems.Add(fileitems[44].ToString());

            listView1.Items.Add(lvi11);

            ListViewItem lvi12 = new ListViewItem();
            lvi12.Text = fileitems[45];
            lvi12.SubItems.Add(fileitems[46].ToString());
            lvi12.SubItems.Add(fileitems[47].ToString());
            lvi12.SubItems.Add(fileitems[48].ToString());
            lvi12.SubItems.Add(fileitems[49].ToString());

            listView1.Items.Add(lvi12);

            ListViewItem lvi13 = new ListViewItem();
            lvi13.Text = fileitems[50];
            lvi13.SubItems.Add(fileitems[51].ToString());
            lvi13.SubItems.Add(fileitems[52].ToString());
            lvi13.SubItems.Add(fileitems[53].ToString());
            lvi13.SubItems.Add(fileitems[54].ToString());

            listView1.Items.Add(lvi13);

            ListViewItem lvi14 = new ListViewItem();
            lvi14.Text = fileitems[55];
            lvi14.SubItems.Add(fileitems[56].ToString());
            lvi14.SubItems.Add(fileitems[57].ToString());
            lvi14.SubItems.Add(fileitems[58].ToString());
            lvi14.SubItems.Add(fileitems[59].ToString());

            listView1.Items.Add(lvi14);

            ListViewItem lvi15 = new ListViewItem();
            lvi15.Text = fileitems[60];
            lvi15.SubItems.Add(fileitems[61].ToString());
            lvi15.SubItems.Add(fileitems[62].ToString());
            lvi15.SubItems.Add(fileitems[63].ToString());
            lvi15.SubItems.Add(fileitems[64].ToString());

            listView1.Items.Add(lvi15);

            ListViewItem lvi16 = new ListViewItem();
            lvi16.Text = fileitems[65];
            lvi16.SubItems.Add(fileitems[66].ToString());
            lvi16.SubItems.Add(fileitems[67].ToString());
            lvi16.SubItems.Add(fileitems[68].ToString());
            lvi16.SubItems.Add(fileitems[69].ToString());

            listView1.Items.Add(lvi16);

            ListViewItem lvi17 = new ListViewItem();
            lvi17.Text = fileitems[70];
            lvi17.SubItems.Add(fileitems[71].ToString());
            lvi17.SubItems.Add(fileitems[72].ToString());
            lvi17.SubItems.Add(fileitems[73].ToString());
            lvi17.SubItems.Add(fileitems[74].ToString());

            listView1.Items.Add(lvi17);

            ListViewItem lvi18 = new ListViewItem();
            lvi18.Text = fileitems[75];
            lvi18.SubItems.Add(fileitems[76].ToString());
            lvi18.SubItems.Add(fileitems[77].ToString());
            lvi18.SubItems.Add(fileitems[78].ToString());
            lvi18.SubItems.Add(fileitems[79].ToString());

            listView1.Items.Add(lvi18);

            ListViewItem lvi19 = new ListViewItem();
            lvi19.Text = fileitems[80];
            lvi19.SubItems.Add(fileitems[81].ToString());
            lvi19.SubItems.Add(fileitems[82].ToString());
            lvi19.SubItems.Add(fileitems[83].ToString());
            lvi19.SubItems.Add(fileitems[84].ToString());

            listView1.Items.Add(lvi19);

            ListViewItem lvi20 = new ListViewItem();
            lvi20.Text = fileitems[85];
            lvi20.SubItems.Add(fileitems[86].ToString());
            lvi20.SubItems.Add(fileitems[87].ToString());
            lvi20.SubItems.Add(fileitems[88].ToString());
            lvi20.SubItems.Add(fileitems[89].ToString());

            listView1.Items.Add(lvi20);

            ListViewItem lvi21 = new ListViewItem();
            lvi21.Text = fileitems[90];
            lvi21.SubItems.Add(fileitems[91].ToString());
            lvi21.SubItems.Add(fileitems[92].ToString());
            lvi21.SubItems.Add(fileitems[93].ToString());
            lvi21.SubItems.Add(fileitems[94].ToString());

            listView1.Items.Add(lvi21);

            ListViewItem lvi22 = new ListViewItem();
            lvi22.Text = fileitems[95];
            lvi22.SubItems.Add(fileitems[96].ToString());
            lvi22.SubItems.Add(fileitems[97].ToString());
            lvi22.SubItems.Add(fileitems[98].ToString());
            lvi22.SubItems.Add(fileitems[99].ToString());

            listView1.Items.Add(lvi22);

            ListViewItem lvi23 = new ListViewItem();
            lvi23.Text = fileitems[100];
            lvi23.SubItems.Add(fileitems[101].ToString());
            lvi23.SubItems.Add(fileitems[102].ToString());
            lvi23.SubItems.Add(fileitems[103].ToString());
            lvi23.SubItems.Add(fileitems[104].ToString());

            listView1.Items.Add(lvi23);

            foreach (ListViewItem lwi in listView1.Items)
            {
                if (Convert.ToInt32(DateTime.Now) > Convert.ToInt32(dateTimePicker4.Value)+3)
                {
                    lwi.BackColor = Color.OrangeRed;
                }
            }
        }

Weiß jemand was ich falsch mache?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 30 Minuten schrieb Kackboon:

Funktioniert mittlerweile. Habe einfach ein neues ListViewItem eingefügt und die zahlen angepasst. Aber das geht bestimmt auch ohne dass ich 99x den selben Code einfügen muss (siehe unten), oder ?

Indem man Schleifen verwendet...

vor 30 Minuten schrieb Kackboon:

Weiß jemand was ich falsch mache?

Ein Objekt vom Typ DateTime kannst du nicht in ein Integer umwandeln. Was soll denn da auch rauskommen?

if((Datetime.Now - dateTimePicker4.Value).TotalDays > 3)
{
    ...
}

oder

if( DateTime.Now.Subtract(dateTimePicker4.Value).Days > 3)
{
    ...
}

 

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 10 Minuten schrieb Whiz-zarD:

if((Datetime.Now - dateTime.Picker4.Value).TotalDays > 3) {     ... }

beim Starten im Debug-Modus stelle ich fest, dass er gar nicht erst in die Bedingung rein geht. Müsste doch eigentlich gehen, da es unter dem Load Event ist.

vor 13 Minuten schrieb Whiz-zarD:

Indem man Schleifen verwendet...

Daran scheitere ich leider. ich weiß nicht wie das aussehen soll. Schließlich muss er ja die Benamsung der "lvi1", "lvi2", etc. immer erweitern. Zusätzlich müssen auch die nummern der [  ]angepasst werden, sodass er nicht jedes mal nur die ersten5 nimmt.

ListViewItem lvi23 = new ListViewItem();
            lvi23.Text = fileitems[100];
            lvi23.SubItems.Add(fileitems[101].ToString());
            lvi23.SubItems.Add(fileitems[102].ToString());
            lvi23.SubItems.Add(fileitems[103].ToString());
            lvi23.SubItems.Add(fileitems[104].ToString());

            listView1.Items.Add(lvi23);

Weiß leider nicht wie man das umsetzt

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 33 Minuten schrieb Kackboon:

beim Starten im Debug-Modus stelle ich fest, dass er gar nicht erst in die Bedingung rein geht. Müsste doch eigentlich gehen, da es unter dem Load Event ist.

Daran scheitere ich leider. ich weiß nicht wie das aussehen soll. Schließlich muss er ja die Benamsung der "lvi1", "lvi2", etc. immer erweitern. Zusätzlich müssen auch die nummern der [  ]angepasst werden, sodass er nicht jedes mal nur die ersten5 nimmt.


ListViewItem lvi23 = new ListViewItem();
            lvi23.Text = fileitems[100];
            lvi23.SubItems.Add(fileitems[101].ToString());
            lvi23.SubItems.Add(fileitems[102].ToString());
            lvi23.SubItems.Add(fileitems[103].ToString());
            lvi23.SubItems.Add(fileitems[104].ToString());

            listView1.Items.Add(lvi23);

Weiß leider nicht wie man das umsetzt

Wie wäre es die einzelnen ListViewItems in ein Array zu packen? :)
Dann kannst du da auch ganz locker flockig durchiterieren.

Bsp:

for (int i=0; i < ListViewArray.size();i++) {

ListViewArray[i].SubItems.Add(FileItem[0].ToString());

}

Das Hochzählen der FileItems kriegst du mit einer 2. Schleife genauso gut hin.

Bearbeitet von Gottlike
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 10 Minuten schrieb Kackboon:

beim Starten im Debug-Modus stelle ich fest, dass er gar nicht erst in die Bedingung rein geht. Müsste doch eigentlich gehen, da es unter dem Load Event ist.

Weil eine Invalid Cast Exception geworfen wird, die aber die Form abfängt. Die bekommst du zu sehen, wenn du alle Exceptions unter Debuggen -> Fenster -> Ausnahmeeinstellungen aktivierst. Dann unterbricht der Debugger bei jeder Exception die Ausführung.

vor 12 Minuten schrieb Kackboon:

Daran scheitere ich leider. ich weiß nicht wie das aussehen soll. Schließlich muss er ja die Benamsung der "lvi1", "lvi2", etc. immer erweitern. Zusätzlich müssen auch die nummern der [  ]angepasst werden, sodass er nicht jedes mal nur die ersten5 nimmt.

Hast du dich überhaupt schon mal mit Schleifen beschäftigt? Dann erübrigt sich dein Problem.
Wenn man es richtig macht, brauchst du nicht mal eine Zählschleife, denn deine Datei ist nichts weiter als eine Liste von Objekten und wenn du die Datei eine Struktur geben würdest (z.B. eine Zeile pro Fehlermeldung), dann könntest du die Datei auch vernünftig parsen und bräuchtest nur eine foreach-Schleife.

Derzeit sieht ja deine Datei so aus:

Name1/Gerät1/Datum1/Fehlermeldung1/Name2/Gerät2/Datum2/Fehlermeldung2/...

Es ist nicht erkennbar, wann der Datensatz aufhört und wann er anfängt. Wenn du aber pro Zeile einen Datensatz schreibst, ist der Anfang und Ende definiert:

Name1/Gerät1/Datum1/Fehlermeldung1
Name2/Gerät2/Datum2/Fehlermeldung2
...

Dementsprechend kann man nun die Datei parsen:

List<Fehlermeldungen> fehlermeldungen = new List<Fehlermeldungen>();

foreach (var row in file.Split(new[] {Environment.NewLine}, StringSplitOptions.None))
{
    var columns = row.Split('/')
    fehlermeldungen.Add(new Fehlermeldungen
    {
        Name = columns[0],
        Gerät = columns[1],
        Datum = column[2],
        Fehlermeldung = columns[3]
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Lief zu großen Teilen bereits. Doch jetzt habe ich ein anderes Problem... ^^

Ich wollte die Methoden in externe Klassen auslagern und diese dann in meiner Form1 aufrufen. Sodass ich unter einem Button-Event nur den Methodennamen (und die dazugehörige Instanziierung der Klasse) habe... Mysteriöserweise funktioniert nun wirklich gar nichts mehr. Weder das aufnehmen der Daten von den Eingabefeldern in das ListViewObjekt, noch das speichern/laden etc.

Es gibt keinen Compiler-Fehler. Im Debug Modus wenn ich den Haltepunkt bei einer Methode setze führt er diese auch aus (nachdem er im Designer einmal alles abgelaufen ist..??). Doch leider schreibt er nichts in das ListViewObjekt rein. Alles was ich getan habe war den Code zu verschieben. Ich habe nichts daran geändert (außer die Instanzen hinzugefügt damit ich auf externe Sachen Zugreifen kann.

Beispiel:

private void button1_Click(object sender, EventArgs e)
        {
            saveandload s1 = new saveandload();
            Fehlermeldungen f1 = new Fehlermeldungen(textBox4.Text, comboBox2.Text, dateTimePicker4.Text, dateTimePicker3.Text, textBox2.Text);
            
            //s1.add();
            f1.add();
        }

Das ist mein "hinzufügen" Button, der die Daten in das ListViewObjekt eintragen soll. Der Liegt in der Form1.

public void add()
        {
            //Form1 f2 = new Form1();
            Fehlermeldungen f1 = new Fehlermeldungen(textBox4.Text, comboBox2.Text, dateTimePicker4.Text, dateTimePicker3.Text, textBox2.Text);

            ListViewItem lvi = new ListViewItem();
            lvi.Text = f1.Name;
            lvi.SubItems.Add(f1.Gerät);
            lvi.SubItems.Add(f1.Datum);
            lvi.SubItems.Add(f1.Uhrzeit);
            lvi.SubItems.Add(f1.Fehlermeldung);

            listView1.Items.Add(lvi);

            textBox4.Clear();
            textBox2.Clear();
        }

Das ist meine Methode die in der externen saveandload-Klasse liegt.

Sollte doch eigentlich funktionieren soweit, oder nicht ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 19 Minuten schrieb Kackboon:

Sollte doch eigentlich funktionieren soweit, oder nicht ?

Ich wundere mich, dass das überhaupt übersetzt werden kann.

In button1_Click erstellst du ein saveandload-Objekt, und machst nichts damit. Dann erstellst du ein Fehlermeldungen-Objekt mit den Texten deiner Form und rufst dessen add-Methode auf. Die Methode Fehlermeldungen.add hast du leider nicht gezeigt.

Die Methode saveandload.add, die du gezeigt hast, rufst du nicht auf, der Aufruf ist auskommentiert. Wenn das wirklich kompiliert wird, woher hat saveandload textBox4, comboBox2, listView1 usw.? Das sind Member von Form1, die sollten in saveandload nicht bekannt sein, es sei denn, du hast da irgendeine Vererbung konstruiert oder diese Member auch zu saveandload hinzugefügt. Beides wäre Unsinn.

Wenn du saveandload von Form1 abgeleitet hast, dann erzeugst du mit new saveandload() eine neues Form-Objekt, das natürlich auch sein eigenes ListView hat, das nur (noch) nicht angezeigt wird. Du kannst nicht erwarten, dass Einträge, die du in dieses neue ListView steckst, in deinem eigentlichen auf Form1 erscheinen.

Wenn du die Steuerelement-Member einfach so zu saveandload hinzugefügt hast, ist das Problem dasselbe: Das saveandoad.listView1 ist nicht dasselbe wie das, das gerade in Form1 angezeigt wird.

Objektorientierung bedeutet nicht, dass man Methoden in Klassen sortiert und dann nach Bedarf neue Objekte erzeugt. Das ist aber ein Anfängerproblem, das man häufiger beobachten kann. Der Unterscheid zwischen Klasse und Objekt ist noch nicht ganz klar. Irgendwann macht's dann aber Klick.

 

In deinem konkreten Fall: Wenn eine andere Klasse irgendwas mit dem ListView auf Form1 machen soll, braucht sie eine Referenz auf die Form oder das ListView.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Mein Fehler

Der Code für die .add() Methode ist zwei mal vorhanden (mein amateurversuch das zum laufen zu bringen) hab den falschen code hier rein kopiert.

Der richtige code von der saveandload klasse ist der hier:

public void add()
        {
            Form1 f2 = new Form1();
            Fehlermeldungen f1 = new Fehlermeldungen(f2.textBox4.Text, f2.comboBox2.Text, f2.dateTimePicker4.Text, f2.dateTimePicker3.Text, f2.textBox2.Text);

            ListViewItem lvi = new ListViewItem();
            lvi.Text = f1.Name;
            lvi.SubItems.Add(f1.Gerät);
            lvi.SubItems.Add(f1.Datum);
            lvi.SubItems.Add(f1.Uhrzeit);
            lvi.SubItems.Add(f1.Fehlermeldung);

            f2.listView1.Items.Add(lvi);

            f2.textBox4.Clear();
            f2.textBox2.Clear();
        }

Zusätzlich habe ich auch mit dem hier experimentiert:

 public class saveandload : Form1
    {

Habe einfach  ": Form1" hinzugefügt in der Hoffnung, dass ich dann nicht diese Instanziierung benötige für die TextBoxen und listviewitem etc. Er gibt auch keinen Compilerfehler wenn ich das "f2." vor den TextBoxen etc weglasse (brauch ich also nicht?)

dennoch funktioniert das ganze so nicht. Wenn ich dich richtig verstehe sorgt also diese diese Vererbung NICHT dafür, dass er die ListView aus der Form1 nimmt wenn ich diese verwenden möchte in der saveandload klasse? Ich dachte bislang dass man Zugriff auf die Objekte aus anderen Klassen (oder Formen) durch diese Instanziierung erhält und das man sie dann verwenden kann. Offensichtlich scheint das nicht der Fall zu sein.

Wie füge ich denn so eine Referenz hinzu ? Habe das noch nie gemacht.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 1 Stunde schrieb Kackboon:

Wenn ich dich richtig verstehe sorgt also diese diese Vererbung NICHT dafür, dass er die ListView aus der Form1 nimmt wenn ich diese verwenden möchte in der saveandload klasse? Ich dachte bislang dass man Zugriff auf die Objekte aus anderen Klassen (oder Formen) durch diese Instanziierung erhält und das man sie dann verwenden kann. Offensichtlich scheint das nicht der Fall zu sein.

Du hast eine falsche Vorstellung von Klassen und Objekten.

Das kommt jetzt vermutlich überraschend: Form1 hat kein ListView.

Eine Klasse ist ein Bauplan. Stell dir einen Bauplan von einem Schrank vor. Der Schrank hat laut Plan eine Tür. 

Wenn ich jetzt auf den Plan zeige und dich bitte, die Tür zu öffnen, wirst du berechtigterweise fragen: "Welche Tür? Die Tür von welchem Schrank?".

 

Form1 ist der Bauplan. Jedes Objekt, das nach dem Form1-Plan erstellt wird, hat ein ListView. Das Objekt wird irgendwo im automatisch generierten Code erzeugt.

Wenn du eine Klasse saveandload deklarierst und von Form1 erben lässt, hast du zunächst einmal nur einen weiteren Bauplan, der besagt, dass jedes nach diesem Plan gebaute Objekt ein Form1 ist, mit den zusätzlichen Extras, die noch in dem saveandload-Bauplan stehen.

Und wenn du ein neues saveandload-Objekt erzeugst, steckt da auch ein neues Form1-Objekt drin. Und das hat natürlich auch ein neues ListView. Das ist aber das falsche ListView. Um auf das Beispiel mit dem Schrank zurückzukommen: Wenn du die Tür einen ganz bestimmten Schranks öffnen willst, bringt es nichts, wenn du einen neuen Schrank baust und dessen Tür öffnest.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...