Entwickler-Ecke
WinForms - DataGridView mit Schleife füllen
edvazubi - Di 18.06.19 10:18
Titel: DataGridView mit Schleife füllen
Hallo,
ich möchte ein DataGridView mit Hilfe einer Schleife füllen. Dabei soll ein Wert von 6500 auf 9000 hochgezählt werden.
Meine Schleife funktioniert, (ist ja auch nicht sonderlich schwer) allerdings wird mir im DataGridView nur der letzte Wert (9000) angezeigt. Meine Lösung sieht folgendermaßen aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| public void Dataadd() { DataTable dt = new DataTable(); dt.Clear(); dt.Columns.Add(new DataColumn("ABCD")); dt.Columns.Add(new DataColumn("Kalenderwoche")); dt.Columns.Add(new DataColumn("Monat")); dt.Columns.Add(new DataColumn("Jahr")); dt.Columns.Add(new DataColumn("von")); dt.Columns.Add(new DataColumn("bis"));
DataRow dr = dt.NewRow(); Int32 i = 0;
dr["ABCD"] = 6500; dt.Rows.Add(dr);
Int32 ABCD= 6500; DataGridViewRow newRow = new DataGridViewRow();
while (i < 2500) { foreach (DataRow row in dataGridView1.Rows) { ABCD++; dr["ABCD"] = ABCD; i++; } } |
Ich denke leider, dass ich mit der Lösung auf dem Holzweg bin, hab aber nicht die Erfahrung um den Denkfehler zu finden...
Ich bedanke mich im voraus schonmal für Hilfe.
Th69 - Di 18.06.19 11:22
Was genau meinst du mit "soll hochgezählt werden"?
Wieviele
Rows hast du denn bei deiner
dataGridView?
Dein Code ist außerdem sehr wirr. Du hast viele Variablen, die du gar nicht benutzt (z.B. die gesamte
DataTable tb, die du zwar initialisierst, aber nicht weiter verwendest - sowie
newRow).
Wenn du die
DataTable für das
DataGridView benutzen möchtest, so mußt du diese als
DataSource daran binden:
C#-Quelltext
1:
| dataGridView1.DataSource = dt; |
edvazubi - Di 18.06.19 11:33
Das ganze soll laut meinem Ausbilder explizit ohne DataSource gefüllt werden. Ich habe das DataGridView schon mithilfe einer CSV Datei gefüllt, was super funktioniert. Nun versuche ich meinen Code abzuwandeln. Ich bin auch für eine ganz andere Lösung als meine offen.
Ich muss dazu betonen, dass ich mich vor allem mit Netzwerktechnik beschäftige und mein Chef mir in unregelmäßigen Abständen immer mal wieder sowas aufbrummt, wovon ich wenig Ahnung habe.
Ralf Jansen - Di 18.06.19 12:57
Ich vermute mal du willst 2500 Zeilen in dem Grid haben mit jeweils einem anderen Wert für ABCD?
Im Moment hast du genau eine Row da dt.NewRow(); ja nur genau 1mal aufgerufen wird.
Das neu anlegen der Row muß also mit in die Schleife die du versuchst zu programmieren.
Übrigens im Moment bist du dabei 2 mal über die Dinge zu iterieren (per while und per foreach), 1mal reicht völlig.
edvazubi - Mi 19.06.19 07:57
Wie bekomme ich es denn hin, dass die ich Zeilen in meiner Schleife hinzufüge und die Werte auch angezeigt werden. Hab gestern diverse Dinge probiert, aber daran scheitert es aktuell irgendwie.
edvazubi - Do 20.06.19 08:30
Ich hab meine Code nochmal komplett überworfen, er sieht jetzt folgendermaßen aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| public void Dataadd() { dataGridView1.ColumnCount = 6; dataGridView1.Columns[0].Name = "ABCD"; dataGridView1.Columns[1].Name = "Kalenderwoche"; dataGridView1.Columns[2].Name = "Monat"; dataGridView1.Columns[3].Name = "Jahr"; dataGridView1.Columns[4].Name = "von"; dataGridView1.Columns[5].Name = "bis";
Int32 i = 0; Int32 ABCD= 6500; while (i < 2500) { ABCD.ToString(); string[] row = new string[] { "ABCD", "30", "7", "2007", "23.07.2007", "29.07.2007" }; dataGridView1.Rows.Add(row); i++; } } |
Ich verstehe, dass das Problem ist, dass in meiner Schleife an der Stelle wo ich die Werte hinzufüge, nur Strings genommen werden. Somit habe ich jetzt 2500 mal ABCD, 30 usw.
Wie kriege ich es hin, dass ich an der Stelle wo die Werte hinzugefügt werden, auch Variablen genommen werden, damit jeder Wert einzeln aufgelistet wird?
erfahrener Neuling - Do 20.06.19 08:39
edvazubi hat folgendes geschrieben : |
Wie kriege ich es hin, dass ich an der Stelle wo die Werte hinzugefügt werden, auch Variablen genommen werden, damit jeder Wert einzeln aufgelistet wird? |
Meinst du so?
C#-Quelltext
1:
| string[] row = new string[] { ABCD.ToString(), "30", "7", "2007", "23.07.2007", "29.07.2007" }; |
edvazubi - Do 20.06.19 08:52
Genau so, Dankeschön.
erfahrener Neuling - Do 20.06.19 08:59
Btw. kannst du auch ein object-Array anstatt nem string-Array verwenden. Dann bleiben die ursprünglichen Datentypen erhalten (also int, DateTime, etc.) und es liegt nicht alles als Text vor
C#-Quelltext
1: 2:
| object[] row = new object[] { ABCD, 30, 7, 2007, new DateTime(2007, 7, 23), new DateTime(2007, 7, 29) }; dataGridView1.Rows.Add(row); |
edvazubi - Do 20.06.19 10:53
So, es hat sich ein bisschen was ein meinem Code getan. Jetzt stehe ich noch vor 2 Problemen.
Zum einen möchte ich wenn es einen Jahres bzw. Monatswechsel innerhalb einer Woche gibt, den Monat und das Jahr dem Monat und dem Jahr zuordnen, von der die Woche mehr Tage hat.
Zum anderen, versuche ich die Kalenderwochen zu berechnen, das funktioniert auch aktuell noch nicht.
Mein Code sieht aktuell so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| public void Dataadd() { dataGridView1.ColumnCount = 6; dataGridView1.Columns[0].Name = "ABCD"; dataGridView1.Columns[1].Name = "Kalenderwoche"; dataGridView1.Columns[2].Name = "Monat"; dataGridView1.Columns[3].Name = "Jahr"; dataGridView1.Columns[4].Name = "von"; dataGridView1.Columns[5].Name = "bis";
Int32 i = 0; Int32 ABCD = 6500; DateTime oldDate = new DateTime(2007, 7, 16); DateTime bisoldDate = new DateTime(2007, 7, 22);
while (i < 2500) { DateTime newDate = oldDate.AddDays(7); oldDate = newDate; DateTime bisnewDate = bisoldDate.AddDays(7); bisoldDate = bisnewDate; int Jahr = oldDate.Year; int Monat = oldDate.Month; string[] row = new string[] { ABCD.ToString(), "30", Monat.ToString(), Jahr.ToString(), oldDate.ToString(), bisoldDate.ToString() }; dataGridView1.Rows.Add(row); ABCD++; i++; } } |
edvazubi - Do 20.06.19 11:43
Kurzes Update, die Wochen Jahre und Monate ließen sich Anhand des Donnerstags in der jeweiligen Woche berechnen. Jetzt fehlt mir nur noch, wie ich vom Datum auf die korrekte Kalenderwoche schließe.
edvazubi - Do 20.06.19 13:49
Die Calender.GetWeekOfYear Methode funktioniert soweit, nur habe ich den Eindruck, dass die Wochen nicht immer ganz stimmen. Abgeglichen mit meiner Excel Tabelle mit den Werten, gibt es bei Jahresübergängen manchmal Probleme. Wo liegt bei mir der Fehler in der Logik? Die Wochen sollen nach ISO 8601 (Donnerstag als Wochenstart) angezeigt werden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| public void Dataadd() { dataGridView1.ColumnCount = 6; dataGridView1.Columns[0].Name = "ABCD"; dataGridView1.Columns[1].Name = "Kalenderwoche"; dataGridView1.Columns[2].Name = "Monat"; dataGridView1.Columns[3].Name = "Jahr"; dataGridView1.Columns[4].Name = "von"; dataGridView1.Columns[5].Name = "bis";
Int32 i = 0; Int32 ABCD= 6500; DateTime oldDate = new DateTime(2007, 7, 16); DateTime bisoldDate = new DateTime(2007, 7, 22); DateTime year = new DateTime(2007, 7, 19);
while (i < 2501) { DateTime newDate = oldDate.AddDays(7); oldDate = newDate; DateTime bisnewDate = bisoldDate.AddDays(7); bisoldDate = bisnewDate; DateTime newyear = year.AddDays(7); year = newyear; int Jahr = year.Year; int Monat = year.Month; DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo; Calendar cal = dfi.Calendar; int intKW = cal.GetWeekOfYear(oldDate, CalendarWeekRule.FirstDay, DayOfWeek.Thursday); string[] row = new string[] { ABCD.ToString(), intKW.ToString(), Monat.ToString(), Jahr.ToString(), oldDate.ToString(), bisoldDate.ToString() }; dataGridView1.Rows.Add(row); ABCD++; i++; } } |
edvazubi - Fr 21.06.19 07:50
Hab das Problem gelöst bekommen. Manchmal muss man auch mal eine Pause machen und dann von neuem auf die Dinge schauen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!