Gerade eben hab ich mir nen Wolf gesucht. Situation: DataGridView in Windows-Forms-Applikation auf das Formular gezogen, per automatisch generierter Datenquelle an Datenbank gebunden – und dann der untaugliche Versuch, die Daten nach dem Editieren im DataGridView gepflegt wieder wegspeichern zu lassen. Untauglich deshalb, da es keine geeigneten Events gibt – weder auf Ebene der DataTable, noch des DataGridViews, noch der Datenquelle.
Nach ein wenig rumgooglen hab ich eine Lösung gefunden: An das PositionChanged-Ereignis der BindingSource binden und dort dann die jeweils letzte Zeile speichern. Könnte dann so aussehen:
private DataRow _lastRow;
public DataRow LastRow
{
get { return _lastRow; }
set { _lastRow = value; }
}
///
/// Wird aufgerufen, wenn sich die Position
/// des Cursors geändert hat
///
private void BindingSource_PositionChanged(
object sender, EventArgs e)
{
// Bindingsource herausfinden
BindingSource source = ((BindingSource)sender);
// Aktuelle Zeile herausfinden
DataRow currentRow = ((DataRowView)source.Current).Row;
// Mit letzter Zeile vergleichen
if (currentRow.Equals(LastRow))
{
return;
}
// Daten aktualisieren
if (null != LastRow)
{
if (LastRow.RowState == DataRowState.Modified)
{
// Updaten der Daten
// …
}
else if (LastRow.RowState == DataRowState.Added)
{
// Hinzufügen der Daten
// …
}
}
// Aktuelle Spalte merken
LastRow = currentRow;
}
Also, irgendwie nervt mich das. Ich werd wohl wieder auf das Click- bzw. DoubleClick-Ereignis des DataGridViews reagieren und dann den aktuellen Datensatz in einem neuen Fenster anzeigen und bearbeiten lassen. Macht sich alles deutlich einfacher.