- 題名: DataGridViewで、選択行の削除と復旧をしたい
- 日時: 2011/12/09 13:03:54
- ID: 29459
- この記事の返信元:
- (なし)
- この記事への返信:
- [29460] Re[1]: DataGridViewで、選択行の削除と復旧をしたい2011/12/09 13:14:52
- [29466] Re[1]: DataGridViewで、選択行の削除と復旧をしたい2011/12/09 15:01:21
- ツリーを表示
■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回を超えた行を削除する仕組みや、
削除を確定する仕組みも必要ですね。
分類:[.NET]
【解決したい問題】
DataGridView にて、選択行の削除したり戻す機能を作りたいです。
@ [削除]ボタンクリック → 選択行の削除
A [戻す]ボタンクリック → 削除した行の復旧
※[戻す]機能は過去の削除動作10回分まで。
@の削除は、下記で行っています。
foreach (DataGridViewRow r in dataGridView1.SelectedRows)
{
if (!r.IsNewRow)
{
dataGridView1.Rows.Remove(r);
}
}
【解決するために何をしたか】
@実行前に、DataTableを保持しておき
A実行時に、dataGridView1.DataSource に DataTableを戻す
という処理をしてみましたが、DataTableのデータ数が多く、
1分以上かかってしまいました。
行の削除・復旧機能実現の効率的な方法はないでしょうか。