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:
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? /(°-°)\
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.
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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? /(°-°)\
@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.
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? /(°-°)\
das mit dem anzeigen funktioniert via des Refresh-Befehls wie Abt dies erwähnte, richtig?
... probiers doch erstmal einfach aus.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code