Benutzer mit den meisten Antworten
Aktuell Zeile in DataGridView wird nicht in Datenbank gespeichert

Frage
-
Hallo!
Ich lese aus einer Datenbank eine Tabelle und verbinde diese per
dataGridView1.DataSource = m_DataSet.Tables["Testdaten"];
mit dem DataGridView.
Nun möchte ich an dem DataGridView manuelle Änderungen und diverse Änderungen per Code durchführen.
Bei den Änderungen per Code stelle ich fest, dass beim späteren Update immer die momentan aktuelle Zeile nicht gespeichert wird. Ich denke, dass ich noch das Ändern der Zeile beenden muss. Suche nun schon seit Tagen und wende mich jetzt hier an das Forum und bitte um Hilfe.
Anbei mein Code:
public partial class Form1 : Form { const string strSqlString = "Data Source=MYMACHINE\\SQLEXPRESS;Initial Catalog=MeineTestdatenbank;Trusted_Connection=Yes;Integrated Security=True"; DataSet m_DataSet; SqlConnection m_SqlConn; SqlDataAdapter m_DataAdapter; SqlCommandBuilder m_CmdBuilder; public Form1() { InitializeComponent(); FillDataSet(); } private void FillDataSet() { try { m_SqlConn = new SqlConnection(strSqlString); m_SqlConn.Open(); m_DataSet = new DataSet(); string strSQL = ""; strSQL = "SELECT ID, Eingabe FROM Testdaten;"; // SqlCommand mit Parameter erzeugen SqlCommand cmd = new SqlCommand(strSQL, m_SqlConn); m_DataAdapter = new SqlDataAdapter(cmd); //m_DataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; m_DataAdapter.TableMappings.Add("Table", "Testdaten"); m_CmdBuilder = new SqlCommandBuilder(m_DataAdapter); m_DataAdapter.UpdateCommand = m_CmdBuilder.GetUpdateCommand(); m_DataAdapter.DeleteCommand = m_CmdBuilder.GetDeleteCommand(); m_DataAdapter.InsertCommand = m_CmdBuilder.GetInsertCommand(); m_DataSet.Clear(); m_DataAdapter.Fill(m_DataSet); dataGridView1.DataSource = m_DataSet.Tables["Testdaten"]; } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } private void toolStripSpeichern_Click(object sender, EventArgs e) { dataGridView1.EndEdit(); m_DataAdapter.Update(m_DataSet); } private void toolStripWerteAendern_Click(object sender, EventArgs e) { dataGridView1.BeginEdit(true); foreach (DataGridViewRow R in dataGridView1.Rows) { R.Cells["Eingabe"].Value = "Any text value..."; } dataGridView1.EndEdit(); } } }
Vielen Dank für jeden Hinweis!- Bearbeitet Lamizi Donnerstag, 5. Juli 2012 05:32
Antworten
-
Hallo Lamizi,
Programmatische Datenaktualisierungen sollten bei datengebundenen Steuerelementen immer über die Datenquelle durchgeführt werden, nicht über die Benutzeroberfläche wie Du das hier machst. Ändere deinen Code in toolStripWerteAendern_Click zu:
DataTable tableToUpdate = m_DataSet.Tables["Testdaten"]; if (tableToUpdate != null) { int rowCount = tableToUpdate.Rows.Count; for (int r = 0; r < rowCount; r++) { tableToUpdate.Rows[r]["Eingabe"] = Convert.ToString(r); } }
Auch solltest Du die Zeile m_DataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey wieder in dein Code aufnehmen.
Warum hast Du die Zeile denn auskommentiert? Damit löst Du nur Probleme aus, z.B. DBConcurrencyException beim Aktualisieren einer vorhandene Spalte (ohne Schlüssel).
Und wenn Du (aus mir unbekannten Gründen) unbedingt über die UI gehen mußt, solltest Du dort DataGridView.EndEdit() aufrufen, andernfalls bleibt der alte Wert erhalten und für den DataAdapter gibt's nichts zu tun:
private void toolStripWerteAendern_Click(object sender, EventArgs e) { if (dataGridView1.CurrentCell.IsInEditMode) dataGridView1.EndEdit(); foreach (DataGridViewRow R in dataGridView1.Rows) { if (!R.IsNewRow) { R.Cells["Eingabe"].Value = "Any text value..."; } } }
Gruß
Marcel
- Bearbeitet Marcel RomaModerator Donnerstag, 5. Juli 2012 06:49
- Als Antwort markiert Lamizi Donnerstag, 5. Juli 2012 08:33
Alle Antworten
-
Hallo Lamizi,
Programmatische Datenaktualisierungen sollten bei datengebundenen Steuerelementen immer über die Datenquelle durchgeführt werden, nicht über die Benutzeroberfläche wie Du das hier machst. Ändere deinen Code in toolStripWerteAendern_Click zu:
DataTable tableToUpdate = m_DataSet.Tables["Testdaten"]; if (tableToUpdate != null) { int rowCount = tableToUpdate.Rows.Count; for (int r = 0; r < rowCount; r++) { tableToUpdate.Rows[r]["Eingabe"] = Convert.ToString(r); } }
Auch solltest Du die Zeile m_DataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey wieder in dein Code aufnehmen.
Warum hast Du die Zeile denn auskommentiert? Damit löst Du nur Probleme aus, z.B. DBConcurrencyException beim Aktualisieren einer vorhandene Spalte (ohne Schlüssel).
Und wenn Du (aus mir unbekannten Gründen) unbedingt über die UI gehen mußt, solltest Du dort DataGridView.EndEdit() aufrufen, andernfalls bleibt der alte Wert erhalten und für den DataAdapter gibt's nichts zu tun:
private void toolStripWerteAendern_Click(object sender, EventArgs e) { if (dataGridView1.CurrentCell.IsInEditMode) dataGridView1.EndEdit(); foreach (DataGridViewRow R in dataGridView1.Rows) { if (!R.IsNewRow) { R.Cells["Eingabe"].Value = "Any text value..."; } } }
Gruß
Marcel
- Bearbeitet Marcel RomaModerator Donnerstag, 5. Juli 2012 06:49
- Als Antwort markiert Lamizi Donnerstag, 5. Juli 2012 08:33
-
Hallo Marcel,
vielen Dank für Deine Antwort!
In dem Fall würde ja die ganze Tabelle bearbeitet werden.
Wie müsste ich es anstellen, wenn ich nur mehrere markierte Zeilen im Grid bearbeiten möchte?
Wie bekomme ich die Info von den markierten Zeilen zum DataSet?
Gruß Lars
-
Bin selbst drauf gekommen! Danke!
DataTable tableToUpdate = m_DataSet.Tables["Testdaten"]; if (tableToUpdate != null) { int rowCount = dataGridView1.SelectedRows.Count; for (int r = 0; r < rowCount; r++) { tableToUpdate.Rows[dataGridView1.SelectedRows[r].Index]["Eingabe"] = "Schlumpf"; } }
-
Hallo Lars,
> In dem Fall würde ja die ganze Tabelle bearbeitet werden
Deiner Beschreibung konnte ich leider nicht entnehmen, dass Du mit gefilterten Daten arbeitest.> Wie müßte ich es anstellen, wenn ich nur mehrere markierte Zeilen im Grid bearbeiten möchte?
Das ist eine strikt UI-bezogene Fragestellung. Sieh dir dazu bitte den letzten Teil meiner vorherigen Antwort an.> Wie bekomme ich die Info von den markierten Zeilen zum DataSet?
Nur das DataGridView hat ein Konzept dazu, DataSet, DataTable und BindingSource nicht. Siehe:
Gewusst wie: Abrufen der ausgewählten Zellen, Zeilen und Spalten im DataGridView-Steuerelement in Windows FormsGruß
Marcel