以下のような状況があるとします。
”あるデータテーブルAとデータテーブルBが存在しており、この2つのデータテーブルはどちらも同じ型である。
その際、テーブルAからテーブルBへ特定の条件にマッチした行データ(DataRow)を移行したい。”
つまり、以下のような状態となります。
XXXXDataTable tableA = new XXXXDataTable(); XXXXDataTable tableB = new XXXXDataTable(); tableA.AddXXXRow(xx, xx, xx); tableA.AddXXXRow(xx, xx, xx); tableA.AddXXXRow(xx, xx, xx); tableA.AcceptChanages();
この状態から、tableBへ特定の行データを移行しようとする場合、そのまま書くと、
tableB.Rows.Add(tableA.Rows[0]);
のようにしたくなりますが、これはうまくいきません。
何故なら、行データは自分自身の状態(DataRowState)と自分が所属しているテーブルを認識しているからです。
上の例だと、tableBに追加してもrowAはまだtableAに所属しているためエラーとなります。
(行データは一度に一つのテーブルにしか所属できません。)
なお、一旦作成された行データの所属テーブルを変更することは出来ません。
(DataRow.Tableプロパティはreadonlyとなっています。)
では、どのようにするかというと、以下のようにします。
DataRowクラスはItemArrayというプロパティを持っています。
このメソッドをコールするとその行データに含まれている全列のデータが配列で返却されます。
それを、tableBへロードするという過程になります。
以下のようになります。
tableB.LoadDataRow(tableA.Rows[0].ItemArray, true);
これで、うまく行データが移行できます。
LoadDataRowメソッドの2番目の引数は、ロード対象のデータに対してロード後、変更処理を確定させるかどうかを指定します。
Trueを指定してメソッドを使用すると、ロードされた行データの状態はUnchanged(変更無し)としてマークされます。
逆にFalseを指定してメソッドを使用すると、ロードされた行データの状態は、Added(追加)としてマークされます。