[DataTable] DataTable の値を別の DataTable に複製する(ただし存在するカラムのみ)

例えば、DataGrid を使用していて何らかの理由により AutoGenerateColumns プロパティを使用できない制約がる場合があるようです。
また、データはデータベースにクエリを発行し DataTable に格納するものとします。

そのような場合、なるべく DataGrid に表示するデータをだけを取得する Select 文を記述するものだと思います。
しかし、場合によっては少し多めのカラムを取得し結果の DataTable をそのまま保持し続けなければならない場合があるようです。

■ 方針

データを取得した DataTable と別に表示用の DataTable を作成し値を複製して表示に使用してみます。

■ 概要

複製元の DataTable の行でループして、複製先のカラムでループして、複製先の DataTable に複製して行きます。
C# であれば 1 行です。
以下のコードの「// !! 先に値をコピー !!」の部分です。

■ コード

// DataTable を作成
var srcDT = new DataTable();
var destDT = new DataTable();

// カラムを設定
new List<string>() { "A", "B", "C" }.ForEach(n => srcDT.Columns.Add(n));
new List<string>() { "A", "C" }.ForEach(n => destDT.Columns.Add(n));

// 元の値を設定
Enumerable.Range(1, 10).Select(i => srcDT.Columns.Cast<DataColumn>().Select(c => $"{c.ColumnName}{i}").ToArray()).ToList().ForEach(vals => srcDT.Rows.Add(vals));

// !! 先に値をコピー !!
srcDT.AsEnumerable().Select(r => destDT.Columns.Cast<DataColumn>().Select(c => r[c.ColumnName]).ToArray()).ToList().ForEach(r => destDT.Rows.Add(r));

// 結果を表示
Console.WriteLine(string.Join("\n", destDT.AsEnumerable().Select(r => string.Join("\t", r.ItemArray.Select(o => o.ToString())))));

■ LINQ の使用が制限される場合

残念ながら、LINQ の使用が制限される場合もあるようです。
しかし、安心してください。LINQ を使わなくても簡単に実現できます。

// DataTable を作成
var srcDT = new DataTable();
var destDT = new DataTable();

// カラムを設定
srcDT.Columns.Add("A");
srcDT.Columns.Add("B");
srcDT.Columns.Add("C");
destDT.Columns.Add("A");
destDT.Columns.Add("C");

// 元の値を設定
for (int i = 1; i <= 10; ++i)
{
    var r = srcDT.NewRow();
    r["A"] = "A" + i.ToString();
    r["B"] = "B" + i.ToString();
    r["C"] = "C" + i.ToString();
    srcDT.Rows.Add(r);
}

// !! 先に値をコピー !!
foreach (DataRow r in srcDT.Rows)
{
    var newR = destDT.NewRow();
    foreach (DataColumn c in destDT.Columns)
    {
        newR[c.ColumnName] = r[c.ColumnName];
    }
    destDT.Rows.Add(newR);
}

// 結果を表示
var result = string.Empty;
foreach (DataRow r in destDT.Rows)
{
    foreach (DataColumn c in destDT.Columns)
    {
        result += r[c.ColumnName];
        result += "\t";
    }
    result += "\n";
}

Console.WriteLine(result);

これで値を複製できました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中