データバインドを有効にしているDataGridViewの行を削除する

データバインドを有効にしているDataGridViewは、単純にグリッドの行(Row)を削除してもデータソースに指定しているデータセットの行を削除してもその後同期が取れなくなる。
また、DataGridViewはDELキーで行の削除ができるがこいつはデータソースと同期が取れておらず、データセットのGetChangesがnullで戻る。当然DiffGramも得られない。


データセットと同期を取りつつDataGridViewの行を削除するには?


以下のようにDataGridViewのBindingContextを取得しカレントの行のビューを取得して、カレントの行ビュー(DataRowView)を削除する。

CurrencyManager cm = 
  (CurrencyManager)form.dataGridView1.BindingContext[form.dataGridView1.DataSource];
DataRowView drv = (DataRowView)cm.Current;
drv.Row.Delete();

こうすればDataGridViewは同期するしGetChangesから戻ったDataSetは有効だ。当然削除した行の正しいDiffgramを得ることもできる。

実際にデータバインド使った事が無いのでこの辺は全く無知。備忘録としてメモ。