2016-07-07 3 views
1

C#、WinForms、DataGridView、DataTable。私のフォームでは、ユーザーは新しい行にデータを入力できます(レコードの単一のレコードビューをポップアップするのではなく)。ユーザーは自分の[保存]ボタンをクリックすると、クリックイベントが次のようになります。DataTable.GetChanges(DataRowState.Added)はNULL値で失敗します。

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

私の仮定は、列挙型とにGetChangesを呼び出すと、私は、実行時にグリッドに追加された行のセットを取得しようとしていることです。しかし、 "Last_Updated_DT"(表示および読み取り専用でなければならない)列のうちの1つが、データテーブルに書き込むときに読み込まれる日付列であるため、エラーが発生します。ただし、DataSetには、この列をnullにすることはできないという規則があります。

問題は、Last_Updated_DT列が実際にnull(驚きの驚き)であることを示すエラーが発生します。その新しい行、およびグリッドでは列が読み込み専用であるため、もちろんnullです。

実際に追加された行を取得する前に、このエラーを回避するか、その列の値を埋め込むにはどうすればよいですか?後世の便宜上

+0

その行はコンパイルされますか?または、DataSetに名前を付けましたか?DataSet?あなたのDataTable ... DataTable? – LarsTech

+0

デフォルト値は読み取り専用の列に設定できます。新しい行はnullの代わりにその値を持ちます。 – Kinetic

+0

@KiNeTiC DateTime.Nowのデフォルト値を設定できますか?これは、GUIからのテキスト以外のもの、およびクリックイベントでのImの後には、その遅すぎるとは思えません。 –

答えて

1

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

私のコードにそのイベントを追加するには私の問題を修正しました。値をString.Emptyに設定して、保存をクリックするまで日付/時刻の値を列に入れません。

はその後、Save_Clickイベントで、私はこのコードで追加された行を取得します:

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

その後、TableAdapter.Insertパラメータリストで、私は日付パラメータ用のDateTime.Nowを追加しました。

最終的にDataSetオーバーロードを使用してMyTableAdapter.Updateメソッドを呼び出します。

すべて固定です。

必要なガイダンスを提供するために@KiNeTiCへのハットチップ。

関連する問題