気になった事を自由に書いてます。
      
更新:2011/03/30
編集前のDataTableに戻す方法を調べてみた。
編集前のDataTableに戻す方法を調べてみました。
このサンプルはまずテストデータを作成します。その後DataTableを編集し、
RejectChanges()メソッドでAcceptChanges()後のDataTableに戻しています。

テストコード
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
DataSet ds = new DataSet();
DataTable dt = new DataTable();
DataRow dr = null;

// 列を定義
dt.Columns.Add("A", Type.GetType("System.String"));
dt.Columns.Add("B", Type.GetType("System.String"));
dt.Columns.Add("C", Type.GetType("System.String"));

// データを格納
for (int i = 1; i <= 5; i++)
{
  dr = dt.NewRow();

  dr["A"] = "A_" + i.ToString("00");
  dr["B"] = "B_" + i.ToString("00");
  dr["C"] = "C_" + i.ToString("00");

  dt.Rows.Add(dr);
}

// すべての変更をコミット
dt.AcceptChanges();

//--------------------------------------------------
// 1回目
//--------------------------------------------------
Console.WriteLine("初期データです(1回目)");
foreach (DataRow row in dt.Rows)
{
  Console.WriteLine(row["A"].ToString() + " " + 
      row["B"].ToString() + " " + row["C"].ToString());
}

// データを変更
foreach (DataRow row in dt.Rows)
{
  row["A"] = row["A"].ToString() + "CHG";
  row["B"] = row["B"].ToString() + "CHG";
  row["C"] = row["C"].ToString() + "CHG";
}

//--------------------------------------------------
// 2回目
//--------------------------------------------------
Console.WriteLine("データを変更した結果です(2回目)");
Console.WriteLine("-------------------------------");
foreach (DataRow row in dt.Rows)
{
  Console.WriteLine(row["A"].ToString() + " " + 
      row["B"].ToString() + " " + row["C"].ToString());
}

// 元に戻す
dt.RejectChanges();

//--------------------------------------------------
// 3回目
//--------------------------------------------------
Console.WriteLine("初期状態に元に戻した結果です(3回目)");
Console.WriteLine("-----------------------------------");
foreach (DataRow row in dt.Rows)
{
  Console.WriteLine(row["A"].ToString() + " " + 
      row["B"].ToString() + " " + row["C"].ToString());
}

出力
初期データです(1回目)
A_01 B_01 C_01
A_02 B_02 C_02
A_03 B_03 C_03
A_04 B_04 C_04
A_05 B_05 C_05
データを変更した結果です(2回目)
-------------------------------
A_01CHG B_01CHG C_01CHG
A_02CHG B_02CHG C_02CHG
A_03CHG B_03CHG C_03CHG
A_04CHG B_04CHG C_04CHG
A_05CHG B_05CHG C_05CHG
初期状態に元に戻した結果です(3回目)
-------------------------------
A_01 B_01 C_01
A_02 B_02 C_02
A_03 B_03 C_03
A_04 B_04 C_04
A_05 B_05 C_05
なぜ値が戻るのか…と気になりませんか??
実はDataTableに含まれるDataRowがポイントなんです。
DataRowには値を保持する領域が複数あります。
私が知る限りでは、CurrentとOriginalです。

Currentは今現在操作している値を指します。
OriginalはこのサンプルでいうとAcceptChanges()後の値を指します。
通常はCurrentのデータしか操作できません。
Originalへアクセスするためには row[0, DataRowVersion.Original]
とDataRowVersion.Originalを付加する必要があります。

      





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