- 題名: 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分以上かかってしまいました。
行の削除・復旧機能実現の効率的な方法はないでしょうか。