Laden...

Rangliste via DataTable und DataSet automatisch abspeichern und neue Werte zuweisen

Erstellt von NecroVortex vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.198 Views
N
NecroVortex Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren
Rangliste via DataTable und DataSet automatisch abspeichern und neue Werte zuweisen

Guten Abend zusammen,

da ich aktuell C# und Windows Forms arbeite, hoffe ich dass ich wirklich richtig bin in diesem Bereich... (schande über mich wenn nicht >.<)

  • Google/YouTube spuckt mir förmlich nie das Ergebnis aus, was ich wirklich haben möchte oder es ist mit Buttons, egal ob ich es in Englisch oder Deutsch eingebe.

  • Bitte nicht zu scharf mit mir ins Gericht gehen, ich lerne seit Anfang September erst C# in der Schule...

Ich hab folgendes anliegen:

Mein Projekt besteht aus 3 Form's:

  1. Form -> Startfenster (Eingabe des Spielernamens)
  2. Form -> aktuelle Level (Zeitmessung und Neustart Zähler)
  3. Form -> Rangliste

So, nun zu meinem Problem:

Ich kann von Form 1 den Spielernamen auf Form 2 übertragen. Von Form 2 kann ich Spielername, Zeitmessung und die Anzahl der Neustarts in Form 3 übertragen.

In Form 3 habe ich ein DataGridView hinzugefügt, wo ich eine Rangliste von Platz 1 bis Platz 10 haben möchte. Dabei sollen bei jedem Durchlauf die Daten des Spielers eingetragen werden. Sobald jemand anderes spielt, sollen alle anderen Spieler angezeigt werden und der neue hinzugefügt werden und dann soll es sortiert werden. Ich möchte dafür keinen zusätzlichen Button klicken oder ähnliches. Ich hab es mittlerweile soweit geschafft, dass eine XML-Datei werte speichert, aber bei einem neuen Durchgang werden die Daten in der XML-Datei hinzugefügt, im DataGridView wiederum sehe ich nur die des aktuellen Spielers..

Ich verzweifel langsam ziemlich und möchte fast schon aufgeben.. Es klappt alles soweit, nur hänge ich bei der Rangliste und ich finde im Internet nur Videos bezüglich Daten hinzufügen mit Buttons, was ich eben nicht möchte. Das soll alles automatisch passieren.

namespace Hindernislauf_3._0
{
    public partial class Form3 : Form
    {
        //Counter(Timer) aus FormBall
        int zeit;
        
        //TextBox1.Text aus Form 1 - Gamertag
        string spielername;

        //Counter(Deathcount) aus FormBall
        int tode;

        //Platz 1 bis 10 in der Rangliste
        //int platz;
  

        DataTable Rangliste = new DataTable();
        DataSet dataSet = new DataSet();
        DataRow dr;

        string[,] Rang = new string[10, 4]; //2-Dimensionales Array zum erstellen der Platzierung von 1 bis 10

        public Form3(string gamertag, int time, int death)
        {
            InitializeComponent();
            
            spielername = gamertag;
            zeit = time;
            tode = death;

            

        }

        public void Form3_Load(object sender, EventArgs e)
        {
            XmlReader xmlFile;
            xmlFile = XmlReader.Create(@"I:\2. Mittelstufe\5. Programmieren\C#\Projekt\Hindernislauf 3.0\Hindernislauf 3.0\Properties\DataSources\Rangliste.xml", new XmlReaderSettings());
            dataSet.ReadXml(xmlFile);
            dataGridView1.DataSource = xmlFile;


            //Das sind die Spalten der ganzen Tabelle, was wo eingefügt werden soll
            //Name of the Columns
            Rangliste.Columns.Add("Platz: ", typeof(int));
            Rangliste.Columns.Add("Spieler: ", typeof(String));
            Rangliste.Columns.Add("Zeit: ", typeof(int));
            Rangliste.Columns.Add("Tode: ", typeof(int));


            //Der Inhalt der Tabelle "Rangliste" wird mit dem DataGridView verknüpft
            //The Data's from Table "Rangliste" bound to the DataGridView
            dataGridView1.DataSource = Rangliste;


            //Die Tabelle wird mit DataSet verknüpft
            //The Table bounds to DataSet
            dataSet.Tables.Add(Rangliste);


            dr = Rangliste.NewRow();


            //Erstellt die Platzierung 1 bis 10
            //Loop for the Ranking (1st to 10th)
            for (int i = 0; i < 10; i++)
            {
                Rang[i, 0] = Convert.ToString(i + 1);
                dr[0] = Rang[i, 0];
            }


            //Erstellt die Spielername 1 bis 10
            //For-Loop for the Gamertag (1st to 10th)
            for (int j = 0; j < 10; j++)
            {
                Rang[j, 1] = spielername;
                dr[1] = Rang[j, 1];
            }


            //Erstellt die Zeit 1 bis 10
            //Loop for the time (1st to 10th)
            for (int k = 0; k < 10; k++)
            {
                Rang[k, 2] = Convert.ToString(zeit);
                dr[2] = Rang[k, 2];
            }


            //Erstellt die Tode 1 bis 10
            //For-Loop for the Death (1st to 10th)
            for (int l = 0; l < 10; l++)
            {
                Rang[l, 3] = Convert.ToString(tode);
                dr[3] = Rang[l, 3];
            }


            Rangliste.Rows.Add(dr);


            //Hier sollen die Daten aus den 2 anderen Formen eingefügt werden
            //Here should placed the Datas from the another 2 Forms
            //for (int j = 0; j < 10; j++)
            //{
            //    dr = Rangliste.NewRow();
            //    dr[0] = Rang[i, 0];
            //    dr[1] = Rang[j, 1];
            //    dr[2] = Rang[k, 2];
            //    dr[3] = Rang[l, 3];
            //    Rangliste.Rows.Add(dr);
            //}


            //Liest eine XML-Datei
            // Read from XML-File
            dataSet.ReadXml(@"I:\2. Mittelstufe\5. Programmieren\C#\Projekt\Hindernislauf 3.0\Hindernislauf 3.0\Properties\DataSources\Rangliste.xml");
            xmlFile.Close();
        }

        public void button1_Click(object sender, EventArgs e)
        {
            //Speichert in eine XML-Datei
            // Save to XML-File
            dataSet.WriteXml(@"I:\2. Mittelstufe\5. Programmieren\C#\Projekt\Hindernislauf 3.0\Hindernislauf 3.0\Properties\DataSources\Rangliste.xml");


            //Beendet das Programm
            //Close the Program
            Application.Exit();
        }
    }
}

Öhm, meeeh? /(°-°)\

T
2.224 Beiträge seit 2008
vor 4 Jahren

DataTable/DataSet sind sehr fette Datenstrukturen, die du am besten meiden solltest.
Ich würde dir empfehlen, eine Klasse für den Rang anzulegen in der dann die Informationen gespeichert werden, die du für die Rangliste brauchst.

Dann kannst du deine Rangliste mit List<T> als List<Rang> abbilden, mit allen Daten die du dann brauchst.
Das speichern der Daten machst du dann per Serialisierung und das einladen über Deserialisierung.
Hier hat .NET bereits fertige mechanismen auf die du wiederum einfach aufbauen kannst.
Hier musst du dann nicht umständlich eigene Werte per XmlReader gehen.

List<T>
Serialisierung

Nachtrag:
Aktuell scheinst du auch einen Fehler im Form3_Load zu haben.
Erst lädst du Daten aus dem Xml File und gibst diese als DataSource an das DataGrid, dann überschreist du aber die DataSource mit deiner Tabelle, die dann vermutlich leer ist.

Das DataTable Rangliste solltest du am besten im Konstruktor von Form3 mit den Spalten füllen und dem DataSet hinzufügen.
In Form3_Load solltest du dann die Datei, wenn vorhanden, einladen und damit das DataSet befüllen.
Ich würde sogar das DataTable Rangliste nicht in der Form3 als Member(Variable) behalten, da du diese nur für das DataSet einmalig beim hinzufügen und nur in Form3_Load brauchst.
Beim Rest arbeitest du primär mit dem DataSet.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.834 Beiträge seit 2008
vor 4 Jahren

NecroVortex, wenn Du die Möglichkeit durch die Schulvorgaben hast, dass Du ein DataSet nicht verwenden musst, dann geh den Weg, den Dir T-Virus gesagt hat.

Erstell Dir eine Klasse wie zB "RunResult" und speicher alle Ergebnisse in einer Liste

List<RunResult> runResults = new List<RunResult>();

Diese Liste kann Du nun als Datenquelle (Source) für Dein DataGridView verwenden.
Du musst neue Ergebnisse damit nur noch in der Liste hinzufügen - fertig.

Das Grundproblem, was aktuell davon unabhängig hast: Du aktualisiert die Datenquelle (hier das DataSet) durch neue Einträge, weswegen diese auch in der XML auftauchen.
Du aktualisiert aber nirgends die Ansicht, also dataGridView1

Ich verzweifel langsam ziemlich und möchte fast schon aufgeben..

Das ist nicht notwendig - ein kurzer Blick in die Doku hätte Dir gezeigt, dass DataGridView über eine Refresh-Methode verfügt.

Die Refresh-Methode brauchst Du immer für die Aktualisierung - egal ob die Daten aus einem DataSet oder aus einer Liste kommen.

N
NecroVortex Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

Hallo ihr beiden,

danke für eure antworten, ich schau mir das gleich alles einmal in Ruhe an.

@Abt

NecroVortex, wenn Du die Möglichkeit durch die Schulvorgaben hast, dass Du ein DataSet nicht verwenden musst, dann geh den Weg, den Dir T-Virus gesagt hat.

Dazu: Die Schulvorgabe war lediglich nur eine Form mit dem Hindernislauf, den Rest habe ich selbst hinzugefügt durch eigen Recherche, damit ich im Schulunterricht etwas zu tun habe. Meine Klasse hängt ein bisschen hinterher.

@T-Virus:

Nachtrag:
Aktuell scheinst du auch einen Fehler im Form3_Load zu haben.
Erst lädst du Daten aus dem Xml File und gibst diese als DataSource an das DataGrid, dann überschreist du aber die DataSource mit deiner Tabelle, die dann vermutlich leer ist.

Lustigerweise werden in die XML-Datei die neuen Daten hinzugefügt bei der Variante wie ich es hier habe. o.O

Ich hab so noch nie mit Klassen gearbeitet, also wenn damit jetzt z.B. ein neue cs-Datei gemeint ist. Ich werde mich diesbezüglich dann einfach mal versuchen rein zu lesen nach und nach. So wie mit den anderen Thematiken, die ich in mein Projekt eingebaut habe.

Gruß

Öhm, meeeh? /(°-°)\

T
2.224 Beiträge seit 2008
vor 4 Jahren

@NecroVortex
Das speichern funktioniert ja auch, weshalb die Daten hinzugefügt werden.
Hier geht es aber um das einladen der Daten.
Diese werden zwar in das DataSet beim Form3_Load eingeladen aber nicht angezeigt.
Solltest du eben noch korrigieren.

Ich empfehle dir aber dich dringend mit Klassen in C# auseinander zu setzen.
Als Objekt Orientierte Programmiersprache (OOP) basiert in C# fast alles auf Klassen.
In C# gibt es noch Strukturen(Struct) die einen ähnlichen Zweck haben, kannst du dich auch einlesen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

N
NecroVortex Themenstarter:in
3 Beiträge seit 2019
vor 4 Jahren

Hallo T-Virus,

das mit dem anzeigen funktioniert via des Refresh-Befehls wie Abt dies erwähnte, richtig? Hab heute doch nicht wirklich dran gearbeitet wie ich wollte und mich nicht so ganz informiert.

Gruß

Öhm, meeeh? /(°-°)\

16.834 Beiträge seit 2008
vor 4 Jahren

das mit dem anzeigen funktioniert via des Refresh-Befehls wie Abt dies erwähnte, richtig?

... probiers doch erstmal einfach aus.