C#.NETのサンプルコードを掲載しています。
      
DataTableを編集前に戻す。
データテーブルのデータを編集、データの追加、削除を行った後、
処理を行う前に戻すサンプルです。
データテーブルを色々変更した後、やっぱり元のデータに戻したいという経験ありませんか?
この機能は既にデータテーブルに存在し、メソッドを呼び出すだけで元の状態に戻してくれます。

メロンパンの価格を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の関係は以下の通り

 
 
 
      
DataSet






Copyright (C) 2011 - 2017 猫の気ままなC#日記