myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Rangliste via DataTable und DataSet automatisch abspeichern und neue Werte zuweisen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Rangliste via DataTable und DataSet automatisch abspeichern und neue Werte zuweisen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
NecroVortex NecroVortex ist männlich
myCSharp.de-Mitglied

avatar-512.gif


Dabei seit: 17.11.2019
Beiträge: 3
Entwicklungsumgebung: C# WinForms
Herkunft: NRW


NecroVortex ist offline

Rangliste via DataTable und DataSet automatisch abspeichern und neue Werte zuweisen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
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();
        }
    }
}

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von NecroVortex am 17.11.2019 01:57.

17.11.2019 01:55 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.407
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von T-Virus am 17.11.2019 08:41.

17.11.2019 08:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.478
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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

Zitat:
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.
17.11.2019 15:28 Beiträge des Benutzers | zu Buddylist hinzufügen
NecroVortex NecroVortex ist männlich
myCSharp.de-Mitglied

avatar-512.gif


Dabei seit: 17.11.2019
Beiträge: 3
Entwicklungsumgebung: C# WinForms
Herkunft: NRW

Themenstarter Thema begonnen von NecroVortex

NecroVortex ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo ihr beiden,

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

@Abt

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

Zitat:
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ß

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von NecroVortex am 17.11.2019 16:04.

17.11.2019 15:59 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.407
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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
17.11.2019 21:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
NecroVortex NecroVortex ist männlich
myCSharp.de-Mitglied

avatar-512.gif


Dabei seit: 17.11.2019
Beiträge: 3
Entwicklungsumgebung: C# WinForms
Herkunft: NRW

Themenstarter Thema begonnen von NecroVortex

NecroVortex ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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ß
17.11.2019 21:15 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.478
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

... probiers doch erstmal einfach aus.
17.11.2019 22:36 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 29.02.2020 10:08