Autor |
Beitrag |
edvazubi
Beiträge: 28
|
Verfasst: Di 18.06.19 09:18
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:
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
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 18.06.19 10: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; |
Für diesen Beitrag haben gedankt: edvazubi
|
|
edvazubi
Beiträge: 28
|
Verfasst: Di 18.06.19 10: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
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 18.06.19 11: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.
Für diesen Beitrag haben gedankt: edvazubi
|
|
edvazubi
Beiträge: 28
|
Verfasst: Mi 19.06.19 06: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.
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 19.06.19 07:27
Wie hast du es denn bei der CSV-Datei gemacht?
Wenn du manuell Zeilen hinzufügen möchtest, dann verwende dataGridView1.Rows.Add(...): C# DataGridView Add Columns and Rows (und diese Methode dann in einer Schleife)
Für diesen Beitrag haben gedankt: edvazubi
|
|
edvazubi
Beiträge: 28
|
Verfasst: Do 20.06.19 07: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
Beiträge: 233
Erhaltene Danke: 19
Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
|
Verfasst: Do 20.06.19 07:39
Für diesen Beitrag haben gedankt: edvazubi
|
|
edvazubi
Beiträge: 28
|
Verfasst: Do 20.06.19 07:52
|
|
erfahrener Neuling
Beiträge: 233
Erhaltene Danke: 19
Win 7, Win 10
C#, ASP-MVC (VS 2017 Community), MS SQL, Firebird SQL
|
Verfasst: Do 20.06.19 07: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); |
Für diesen Beitrag haben gedankt: edvazubi
|
|
edvazubi
Beiträge: 28
|
Verfasst: Do 20.06.19 09: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:
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
Beiträge: 28
|
Verfasst: Do 20.06.19 10: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.
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 20.06.19 11:04
Vereinfacht die Anzahl der Tage im aktuellen Jahr geteilt durch 7.
Jedoch kommt es auf die genaue Definition der Kalenderwoche (z.B. ISO 8601) an, was als erste KW gilt.
Dafür gibt es die Calendar.GetWeekOfYear(...)-Methode.
Für diesen Beitrag haben gedankt: edvazubi
|
|
edvazubi
Beiträge: 28
|
Verfasst: Do 20.06.19 12: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.
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++; } } |
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 20.06.19 13:32
Hast du den Hinweis in dem Link zu der Methode gelesen (sowie den weiteren Link dazu: ISO 8601 Week of Year format in Microsoft .Net)?
|
|
edvazubi
Beiträge: 28
|
Verfasst: Fr 21.06.19 06:50
Hab das Problem gelöst bekommen. Manchmal muss man auch mal eine Pause machen und dann von neuem auf die Dinge schauen.
|
|
|