データテーブルのデータを編集、データの追加、削除を行った後、
処理を行う前に戻すサンプルです。
データテーブルを色々変更した後、やっぱり元のデータに戻したいという経験ありませんか?
この機能は既にデータテーブルに存在し、メソッドを呼び出すだけで元の状態に戻してくれます。
メロンパンの価格を105→110円に変更し、
クリームパンを追加し、カレーパンを削除した後に元に戻す処理を実行してみます。
イメージ的にはこんな感じです。
元の状態に戻すときは
RejectChangesメソッドを使います。
テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
DataSet dataset = new DataSet();
DataTable dt = new DataTable("Table1");
// 列を定義します。
dt.Columns.Add("商品番号");
dt.Columns.Add("商品名");
dt.Columns.Add("価格");
DataRow row = null;
// 商品を追加します。
row = dt.NewRow();
row["商品番号"] = "S0001";
row["商品名"] = "あんぱん";
row["価格"] = 100;
dt.Rows.Add(row);
row = dt.NewRow();
row["商品番号"] = "S0002";
row["商品名"] = "メロンパン";
row["価格"] = 105;
dt.Rows.Add(row);
row = dt.NewRow();
row["商品番号"] = "S0003";
row["商品名"] = "カレーパン";
row["価格"] = 110;
dt.Rows.Add(row);
row = dt.NewRow();
row["商品番号"] = "S0004";
row["商品名"] = "いちごジャムパン";
row["価格"] = 115;
dt.Rows.Add(row);
row = dt.NewRow();
row["商品番号"] = "S0005";
row["商品名"] = "チョココロネ";
row["価格"] = 120;
dt.Rows.Add(row);
row = dt.NewRow();
row["商品番号"] = "S0006";
row["商品名"] = "クロワッサン";
row["価格"] = 125;
dt.Rows.Add(row);
// DataSetにdtを追加します。
dataset.Tables.Add(dt);
dataset.Tables["Table1"].AcceptChanges();
// メロンパンの価格を変更します。
dataset.Tables["Table1"].Rows[1]["価格"] = 110;
// クリームパンを追加します。
DataRow datarow = dataset.Tables["Table1"].NewRow();
datarow["商品番号"] = "S0007";
datarow["商品名"] = "クリームパン";
datarow["価格"] = "130";
dataset.Tables["Table1"].Rows.Add(datarow);
// カレーパンを削除します。
dataset.Tables["Table1"].Rows[2].Delete();
// 元に戻します。
dataset.Tables["Table1"].RejectChanges();
|
65行目を実行した結果が上絵の[変更後]となります。
69行目を実行すると[元の状態]に戻ります。
なぜ、元の状態にもどるのでしょうか?
プログラムが変更した箇所を逐次データテーブルが記憶してるのでしょうか?
実はデータテーブルにはプログラマが通常操作できるテーブルと、編集前の状態を保持している
テーブルの2つのテーブルが存在し、元に戻すときは編集前の状態を保持しているテーブルから
元の状態に戻しているのです。
編集前の状態を保持するテーブルを「Original」と呼び、通常操作するテーブルを「Current」と呼びます。
「Original」テーブルは特殊な操作でないとアクセスできません。さらにデータテーブルにデータの編集、追加、
削除を行っても「Original」テーブルには反映されません。
この「Original」と「Current」はデータテーブルを生成するタイミングで作成します。
サンプルでは2行目がそれにあたります。
さて「Original」からデータを元に戻すとなると、1つ疑問が浮かびます。
なぜRejectChangesメソッド実行後、データテーブルを生成した時の状態にならないのか…
つまり、データが1つも入ってない状態に戻らなかったのでしょうか?
それはサンプルコードの50行目に
AcceptChangesメソッドを実行しているためです。
このメソッドを呼び出すと、「Original」は「Current」で上書きされます。
そのためRejectChangesメソッド実行すると、元の状態に戻ったわけです。
サンプルコードのOriginalとCurrentの関係は以下の通り