削除の事前確認

DataGridViewで行を削除したときに、「データを削除してもよいですか?」などの確認画面の実装について。

VS2005のBindingNavigatorで削除の事前確認をしたい
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-36424.htm

で、BindingNavigatorのイベントをフックする方法があった。
でもCustomToolStripButtonとか作るのが面倒に思えた。

そこでピンときた。いわゆるひとつのアハ体験(笑)
私の場合は、DataSetを使ってるのでそっちでやってみようと。

まず、DataSetのイベントを登録
(DataSetを新しくしたら毎回登録している)

dataSet.Table[0].RowDeleted +=
    new DataRowChangeEventHandler(RowDeleted);

次にDataRowのRowStateがDeletedな状態で以下のメソッドが呼ばれるので
確認画面でNOのときにRejectする。

private void RowDeleted(object sender,DataRowChangeEventArgs e) {
    DialogResult result = 
        MessageBox.Show(
            "消してもいいの?"
            ,"確認"
            ,MessageBoxButtons.YesNo
            ,MessageBoxIcon.Warning);

    if(result == DialogResult.No) {
        e.Row.RejectChanges();
        return;
    }

    e.Row.AcceptChanges();
}

これでNoを選択したときはDataRowのRowStateが元に戻るので
画面上の行も復元できる。

ただし、こうするとDataGridView上では一旦消えてから、確認画面が出る。
人によってはイヤな動きかも。

なにしろ一旦画面から消えてしまうので、一瞬ドキッとする。
で、Noを選択するのと無事復活となる。
このドキッとする感覚が誤操作防止に有効な気がするのでよしとしよう。