DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewで、選択行の削除と復旧をしたい

環境/言語:[OS : Windows 7 / 言語 : C# / .NET Framework : 4]
分類:[.NET]

【解決したい問題】

DataGridView にて、選択行の削除したり戻す機能を作りたいです。

@ [削除]ボタンクリック → 選択行の削除
A [戻す]ボタンクリック → 削除した行の復旧
※[戻す]機能は過去の削除動作10回分まで。

@の削除は、下記で行っています。
foreach (DataGridViewRow r in dataGridView1.SelectedRows)
{
if (!r.IsNewRow)
{
dataGridView1.Rows.Remove(r);

}
}


【解決するために何をしたか】

@実行前に、DataTableを保持しておき
A実行時に、dataGridView1.DataSource に DataTableを戻す
という処理をしてみましたが、DataTableのデータ数が多く、
1分以上かかってしまいました。


行の削除・復旧機能実現の効率的な方法はないでしょうか。
2011/12/09(Fri) 13:18:13 編集(投稿者)

DataTableを使う理由は、削除したDataGridViewRowを元に戻すという機能の実現のためでしょうか?
あと、DataGridViewの内容は、行追加・挿入は行わず、行の削除/元に戻すという機能だけでしょうか?
そうであるならば、Removeした行を格納するリストのようなものを用意し、そこに削除したものをストックする方法はどうでしょうか?
そうすれば、元に戻す場合は、そこからDataGridViewに戻してあげる、という方法です。
(戻す位置も合わせたいのであれば、戻してあげる行の情報も格納する必要がありますね。)
> DataTableを使う理由は、削除したDataGridViewRowを元に戻すという機能の実現のためでしょうか?
はい。
自分なりに考えて、DataTableほ保存しておけばいいのかな?と思ったので。

> あと、DataGridViewの内容は、行追加・挿入は行わず、行の削除/元に戻すという機能だけでしょうか?
はい。
行の追加や挿入はありません。

> そうであるならば、Removeした行を格納するリストのようなものを用意し、そこに削除したものをストックする方法はどうでしょうか?
> そうすれば、元に戻す場合は、そこからDataGridViewに戻してあげる、という方法です。
> (戻す位置も合わせたいのであれば、戻してあげる行の情報も格納する必要がありますね。)
アドバイス、ありがとうございます!
試してみようと思います。

他にも案がありましたらお願いします m(_ _)m
■No29459に返信(みなさんの記事)
> ※[戻す]機能は過去の削除動作10回分まで。

No29452 に書いたように、フィルターを使うという案は如何でしょうか?
>>> RowFilter 等を使えないかな、と思いましたが、
>>> 50万件 → 25 万件のフィルターで 1.8 秒、
>>> 25万件 → 50 万件に復元するのに 2.6 秒でした。

1500件の削除と復元に 1 分かかったとのことですが、
先の処理では、25万行の削除および復元を、1.8 秒で完了しています。

削除対象行のマーキング処理にかかる時間を考慮しても、
今よりは高速に処理できるのではないでしょうか。

(この場合、実際に削除するのではなく、非表示にしているだけです)



(1) DataTable には、int 型の列「DelMark」をひとつ追加しておき、
 各行、初期値として 0 を入れておきます。


(2) DataGridView には、DataTable の代わりに、DataView をセットします。
 フィルターとして、DelMark = 0 を指定しておきます。
 DataView view = new DataView( dataTable1 );
 view.RowFilter = "DelMark=0";
 dataGridView1.DataSource = view;


(3) 選択行を DataRow のコレクションで返すメソッドを用意します。

private List<DataRow> GetSelectedRows()
{
    List<DataRow> rows = new List<DataRow>();
    foreach (DataGridViewRow r in dataGridView1.SelectedRows)
    {
        if (!r.IsNewRow) rows.Add(((DataRowView)r.DataBoundItem).Row);
    }
    return rows;
}


(4) 削除時は、
  1: もう一つ DataView を生成し、DelFlg が 0 以外の行を取得。
  2: それを列挙して、各 DelFlg を +1。
  3: GetSelectedRows で取得されたすべての行に対し、DelFlg を 1 にする。
 とします。

(5) DataGridView に表示させるフィルターを変更することで、
 削除結果を復元します。
 DelFlg <= 1 にすれば 1 回分の復元、DelFlg <= 3 なら 3 回前です。

---

あとは、10回を超えた行を削除する仕組みや、
削除を確定する仕組みも必要ですね。

DOBON.NET | プログラミング道 | プログラミング掲示板