2016-07-07 7 views
1

C#, WinForms, DataGridView, DataTable. Mit meinem Formular kann der Benutzer Daten in eine neue Zeile eingeben (im Gegensatz zu einer einzelnen Datensatzansicht des Datensatzes). Wenn der Benutzer meine Speichern-Schaltfläche klickt, sieht das Click-Ereignis wie folgt aus:DataTable.GetChanges (DataRowState.Added) schlägt mit Nullwerten fehl

DataTable dtAddRows = this.SomeFictitiouslyNamedDataSet.SomeFictitiouslyNamedDataTable.GetChanges(DataRowState.Added); 

Meine Vermutung ist, dass Aufruf GetChanges mit diesem Enum wird mich bekommen eine Reihe von Zeilen, die zur Laufzeit in das Netz aufgenommen wurden . Es tritt jedoch ein Fehler auf, weil eine der Spalten "Last_Updated_DT" (die angezeigt und nur gelesen werden muss) eine Datumsspalte ist, die beim Schreiben in die Datentabelle ausgefüllt wird. Das DataSet verfügt jedoch über eine Regel, dass diese Spalte nicht null sein darf.

Das Problem ist, bekomme ich einen Fehler, der angibt, dass die Last_Updated_DT Spalte tatsächlich Null ist (Überraschung Überraschung). Es ist eine neue Zeile, und die Spalte ist nur im Raster readonly, also ist es natürlich null.

Wie kann ich diesen Fehler umgehen oder einen Wert in diese (oder jene) Zeilen für diese Spalte stopfen, bevor ich tatsächlich versuche, die hinzugefügten Zeilen zu erhalten?

+0

Kompiliert diese Zeile? Oder haben Sie Ihr DataSet ... DataSet benannt? und Ihre DataTable ... DataTable? – LarsTech

+0

Sie können einen Standardwert für diese schreibgeschützte Spalte festlegen. Ihre neuen Zeilen haben diesen Wert anstelle von null. – Kinetic

+0

@KiNeTiC Kann ich einen Standardwert von DateTime.Now festlegen? Dies scheint mit nichts anderem als Text von der GUI zu funktionieren, und nach Im im Click-Ereignis ist es zu spät. –

Antwort

1

Aus Gründen der Nachwelt:

private void myGrid_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e) 
{ 
    e.Row.Cells["MyColumnNameGridViewTextBoxColumn1"].Value = String.Empty; 
} 

dieses Ereignis zu meinem Code hinzufügen feste mein Problem. Ich setze den Wert auf , also würde es keinen Datum/Uhrzeit-Wert in der Spalte setzen, bis nach dem Speichern geklickt wurde.

Dann im Save_Click Ereignisse, erhalte ich die zusätzliche Reihen mit diesem Code:

DataTable dtAddedRows = this.dsMyDataSet.MyDataTable.GetChanges(DataRowState.Added); 

Dann wird in der TableAdapter.Insert Parameterliste, I DateTime.Now für das Datum Parameter hinzugefügt.

Schließlich rufen Sie MyTableAdapter.Update Methode mit der DataSet Überlastung.

Alle behoben.

Hut-Tipp zu @KiNeTiC für die Bereitstellung der notwendigen Anleitung.