Entwickler-Ecke
WinForms - DataGridView Wert über Spaltennamen setzen
mats74 - Mo 22.08.11 13:42
Titel: DataGridView Wert über Spaltennamen setzen
Hallo
Ich füge Zellwerte über den Spaltennamen in meine DataGridView's ein.
Das funktioniert auch bei einer foreach-Schleife tip top.
Bei einer while-Schleife in einer try/catch Anweisung mit Datenbankzugriff habe ich allerdings meine Probleme.
Folgender Code funktioniert:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| DataGridViewRow row; while (leser.Read()) { row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells[0].Value = "Hallo"; }
foreach(DataGridViewRow row in dataGridView1.Rows) { row.Cells["SPALTENNAME"].Value = "Hallo"; } |
Folgender Code funktioniert nicht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| DataGridViewRow row; while (leser.Read()) { row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells["SPALTENNAME"].Value = "Hallo"; } |
Warum kann ich in einer foreach-Schleife die Spalte mit einem Stringwert beschreiben und in einer while-Schleife nicht?
Ich muss die Werte über die Spaltennamen vergeben, da die Spalten während der Verarbeitung verschoben werden.
Danke für eure Tips.
Gruss
mats74
dark-destination1988 - Mo 22.08.11 13:48
probiere mal folgendes
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| while (leser.Read()) { DataGridViewRow row; row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells["SPALTENNAME"].Value = "Hallo"; } |
mats74 - Mo 22.08.11 13:55
Hallo dark-destination1988
Bringt leider nichts.
Folgende Fehlermeldung:
Die Spalte blablabla kann nicht gefunden werden.
Parametername: columnName
Mit Rechtschreibung hat es auch nichts zu tun, da ich den Text schon 1000x (hoffentlich richtig) kopiert habe.
Gruss
mats74
dark-destination1988 - Mo 22.08.11 14:01
row=dataGridView1.Rows.NewRow();
am anfang?
mats74 - Mo 22.08.11 14:14
... bei mir wird die Methode NewRow() in der Auswahl nicht angezeigt.
Darum kann ich's auch nicht testen.
C#-Quelltext
1:
| MessageBox.Show(row.IsNewRow.ToString()); |
... ergibt den Wert False (eingentlich nicht wirklich gut, oder?).
Vor der while-Schleife setze ich noch folgende Methode:
C#-Quelltext
1:
| dataGridView1.Rows.Clear(); |
... damit ich ein leeres DataGridView erhalte.
Hat diese Methode einfluss auf die Spaltennamen?
(Von mir aus gesehen eigentlich nicht, die Spaltennamen werden durch Clear() nicht gelöscht).
Gruss
mats74
dark-destination1988 - Mo 22.08.11 14:29
so ist es normalerweise auch, die struktur bleibt erhalten und die datensätze werden "weggeschmissen". Vieleicht solltest du lieber die datasource verändern anstelle des grids, ich erstelle datatables und weise diese der datasource des datagridviews zu. Ist meiner meinung nach die bessere Lösung, da ein datagridview nur zur darstellung dient
mats74 - Mo 22.08.11 14:41
Da hast Du sicherlich recht.
Die Zuweisung der Datasource ist bestimmt die bessere Lösung.
Ich werde mich zukünftig an dieses Prinzip halten.
Vielleicht finde ich den Fehler doch noch raus, ich würde es dann posten.
Gruss
mats74
mats74 - Mo 22.08.11 16:44
Hallo
Ich habe viele mögliche Codevarianten erstellt und bin zu keinem Resultat gelangt.
Der Fehler hat definitv nichts mit Schleifen oder sonstigen Anweisungen zu tun.
Der Fehler wird immer bei folgendem Code ausgegeben (allgemeingültig zu verstehen):
C#-Quelltext
1: 2: 3: 4:
| DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells["MEINSPALTENNAME"].Value = "Irgendetwas"; dataGridView1.Rows.Add(row); |
Möglicherweise wird diese Programmiermöglichkeit vom Compiler falsch interpretiert oder umgesetzt.
VS ergibt bei mir beim Kompilieren jedenfals keinen Fehler, erst beim Ausführen des Programmcodes.
Also ich beschränke mich wohl oder übel auf die Wertzuweisung durch den Spaltenindex.
Gruss
mats74
Kha - Mo 22.08.11 17:03
Mit ein wenig Debuggen sollte sich das schon herausfinden lassen. Hat CreateCells überhaupt eine Auswirkung, stimmt die Cells-Property danach?
mats74 - Mo 22.08.11 17:08
Also wenn ich den Stringwert mit dem entsprechenden Spaltenindex ersetze, funktioniert alles.
Beim Debuggen bleibt er auf der 3. Zeile stehen
C#-Quelltext
1:
| (row.Cells["MEINSPALTENNAME"].Value = "Irgendetwas";) |
Da bin ich leider am Ende meines Lateins.
dark-destination1988 - Mi 24.08.11 09:13
Versuchs mal so:
das funktioniert
C#-Quelltext
1: 2: 3: 4:
| DataRow row = datatable.NewRow(); row["MEINSPALTENNAME"]="irgendetwas"; datatable.Rows.Add(row); dataGridView.DataSource=datatable; |
mats74 - Mi 24.08.11 11:42
Hallo dark-destination1988
Super, Deine Lösung funktioniert tip top.
Ich habe noch eine kleine Anmerkung.
Die Spalte muss zuerst der DataTable noch bekannt gemacht werden.
Die zusätzlichen Spalten der DataTable werden dann am Schluss des DataGridView's erstellt.
Je nach Anwendung muss dieser Umstand dann noch beachtet werden.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| DataTable datatable = new DataTable(); datatable.Columns.Add("MEINSPALTENNAME"); DataRow row = datatable.NewRow(); row["MEINSPALTENNAME"]="irgendetwas"; datatable.Rows.Add(row); dataGridView.DataSource=datatable; |
Dank Deinem Code habe ich doch noch eine Lösung zum Beschreiben der bestehenden DataGridViewRow's gefunden.
Ich schreibe zuerst eine leere Zeile ins DatagridView und fülle dann die Zellinhalte der DataTable in die verschiedenen Spalten des DataGridView's ein:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| DataTable datatable = new DataTable(); datatable.Columns.Add("MEINSPALTENNAME"); DataRow row = datatable.NewRow(); row["MEINSPALTENNAME"] = "irgendetwas"; datatable.Rows.Add(row); dataGridView1.Rows.Add(); dataGridView1.Rows[0].Cells["MEINSPALTENNAME"].Value = row["MEINSPALTENNAME"].ToString(); |
Somit habe ich die Zellwerte in der richtigen Spalte erhalten und kann den DataGridView-Inhalt aus beliebigen DataTable's zusammenstellen.
Mit diesem kleinen Umweg haben wir doch noch das Ziel erreicht.
Warum ich diesen Umweg über die zusätzliche DataTable machen muss und nicht direkt in eine neue Zeile über den Spaltennamen des DataGridView's editieren kann, ist mir immer noch ein Rätsel.
Aber Hauptsache es funktioniert.
Vielen Dank für Deine Hilfe.
Gruss
mats74
dark-destination1988 - Mi 24.08.11 12:30
naja wie gesagt das datagridview ist im endeffekt das frontend und dient im prinzip zum darstellen. die datatable ist die "quelle" für das dgv.
edit:
das mit der Spalte hinzufügen hat ich vergessen, aber du hast es ja selber rausbekommen ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!