Autor Beitrag
Lens445
Hält's aus hier
Beiträge: 12


C#
BeitragVerfasst: Fr 16.02.18 09:16 
Hey, hätte da mal 2 Fragen :D

Bin ziemlich neu in der Welt des Programmierens :les:

Ich habe eine Methode

ausblenden C#-Quelltext
1:
public List<Result> GetAllKschl(string fileNameResult, string fileNameData)					


die mir eine Liste mit verschiedenen Elementen und dem Inhalt aus einer ewig langen .xml Datei zurückgibt. (Z.b. Info, Einzelpreis, Gesamtpreis, usw.)

Diese Daten gebe ich in einer DataGridView aus. Okay, funktioniert soweit.

Nun habe ich einen weiteren Button Next File angelegt, der mir dann aus dem Order eben die nächste Datei anzeigt. Bzw wieder nur diese bestimmte Elemente aus der XML. (in der DGV)

Das Problem ist jetzt, dass er mir immer nur die erste Datei anzeigt bei dem "next" Button und nicht jede..

Hier mal der Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        public string GetNextFile()
        {
            IEnumerator<string> filesEnumerator = Directory.EnumerateFiles(@"C:\blalba\bli""sum*.xml").GetEnumerator();

            if (filesEnumerator != null && filesEnumerator.MoveNext())
            {
                return filesEnumerator.Current;
            }
            return null;
        }


Was mach ich falsch? Und noch eine Frage: Es wäre ja an sich besser wenn man die Dateinamen nicht in der Methode hat, sondern in seiner GUI, also dem Form1 Code. Da sich die Namen der Datei immer ändern können. Wie mach ich dass denn?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        private void btnNext_Click(object sender, EventArgs e)
        {
            PricingAnalyzer analyzer = new PricingAnalyzer();
            string nextFileResult = (analyzer.GetNextFile()).ToString();

            List<Result> list = analyzer.GetAllKschl(nextFileResult, fileNameData);

            decimal total = analyzer.GetTotalAmount(nextFileResult, fileNameData);

            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            dataGridView1.AutoGenerateColumns = true;
            dataGridView1.DataSource = list;
            txtTotalAmount.Text = total.ToString();
        }


also, dass man hier quasi den Dateipfad angibt und nicht in der Methode :gruebel:
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.02.18 10:45 
Hallo,

ich habe gestern schon deinen Beitrag im myCSharp-Forum Nächste ungeordnete .xml Datei aus Ordner anzeigen? gelesen. Und dir wurde doch schon die Antwort zu deiner Hauptfrage geliefert (mehr könnte ich jetzt dazu auch nicht schreiben).

Und deine 2. Frage ist doch wohl ganz offensichtlich: übergebe einfach Dateipfad und die Dateinamen-Maske als Parameter der Methode.
Lens445 Threadstarter
Hält's aus hier
Beiträge: 12


C#
BeitragVerfasst: Fr 16.02.18 11:15 
Hey,

Ja, aber ich verstehe eben nicht so ganz, wo ich meinen Enumerator instanzieren muss, damit er nicht immer von vorne anfängt :gruebel:

Direkt beim deklarieren.. okay dachte das mache ich hier??

ausblenden C#-Quelltext
1:
IEnumerator<string> filesEnumerator = Directory.EnumerateFiles(@"C:\blalba\bli""sum*.xml").GetEnumerator();					


Bin einfach noch neu und das ist noch sehr verwirrend :les:
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.02.18 11:57 
Direkt in der Methode wird diese Variable bei jedem Aufruf neu initialisiert.
Lege diese als Membervariable der Klasse an und initialisiere diese eben vorher in einer anderen Methode.
Alternativ:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
IEnumerator<string> filesEnumerator;

public string GetNextFile()
{
    if (filesEnumerator == null)
        filesEnumerator = Directory.EnumerateFiles(@"C:\blalba\bli""sum*.xml").GetEnumerator();

    if (filesEnumerator != null && filesEnumerator.MoveNext())
    {
        return filesEnumerator.Current;
    }

    return null;
}

(Die Variante mittels yield erzeugt vom Compiler ähnlichen Code).
Lens445 Threadstarter
Hält's aus hier
Beiträge: 12


C#
BeitragVerfasst: Fr 16.02.18 12:16 
Ah, achso okay, danke :)

mit deinem Code geht es allerdings auch nicht, er zeigt mir immernoch nur die erste Datei an :gruebel:

Und bei der Variante mit dem yield da sagt er immer das im Pfad ein ungültiges Zeichen eingegeben wurde, was aber nicht sein kann, weil ich im Pfad nichts verändert habe, deswegen blieb ich bei der jetzigen Variante.

Ich probiers jetzt nochmal mit einer Membervariable :!:
Lens445 Threadstarter
Hält's aus hier
Beiträge: 12


C#
BeitragVerfasst: Fr 16.02.18 13:35 
Wie genau meinst du des "initialisiere diese vorher in einer anderen Methode?"

Einfach, eine neue Methode dafür anlegen?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.02.18 14:16 
Ja, das meinte ich damit (und diese dann z.B. aus dem Konstruktor der Form heraus aufrufen).

Aber, ich sehe jetzt den Fehler: du mußt natürlich auch die Variable PricingAnalyzer analyzer (aus deiner Button-Click Methode) ebenso als Membervariable (der Form) anlegen, da sonst auch hierbei immer wieder ein neues Objekt bei jedem Button-Click erzeugt wird (und damit auch jedesmal ein neuer filesEnumerator).

Du solltest also nochmal die Grundlagen der OO-Programmierung durchgehen und dir das Thema "Lebenszeit von Variablen" (engl. "scope of variables") nochmal zu Gemüte führen (also Unterschied von lokalen und Membervariablen sowie auch statischen Variablen).
Lens445 Threadstarter
Hält's aus hier
Beiträge: 12


C#
BeitragVerfasst: Mo 19.02.18 08:29 
Ah, danke dir! Jetzt funktioniert es auch! :zustimm: