2010/11/27

[C#]DataTableの行を入れ替える

このエントリーをはてなブックマークに追加
DataTableの指定行を入れ替える方法です。
ソートとかしたいだけなら、DataViewを利用したほうが間違いなくいいのでそっちでお願いします。

DataTableの行の入れ替え


ソースコード

private bool swapRow(DataRow row1,DataRow row2) {
    if (row1.Table != row2.Table) {
        // 同じテーブルに所属している必要があります
        return false;
    }

    DataTable table = row1.Table;
    
    // ①
    // row1のコピーを作成
    int index1 = table.Rows.IndexOf(row1);
    DataRow newRow1 = table.NewRow();
    newRow1.ItemArray = row1.ItemArray;

    // row2のコピーを作成
    int index2 = table.Rows.IndexOf(row2);
    DataRow newRow2 = table.NewRow();
    newRow2.ItemArray = row2.ItemArray;

    // ②
    // コピーを入れ替えて挿入しつつ、元の行は削除
    table.Rows.InsertAt(newRow1, index2);
    table.Rows.Remove(row2);
    table.Rows.InsertAt(newRow2, index1);
    table.Rows.Remove(row1);
    return true;
}


それぞれに対応する新しい行を作成。行1と行2の内容をそれぞれ複製しておく。


複製行を入れ替えて挿入してつつ、元の行を抹消します。
行1の複製を行2の位置に挿入した後に、行2を消す。
同じく行2の複製を行1の場所に挿入した後に、行1を消す。


table.Rows.RemoveしてそのままrowをどこかにInsertAtしちゃえば、一見できそうに思うのですが、Removeした段階で、rowの内容が全部抹消されてしまうのです。


なお、この方法では、RowState.Deleted、RowState.Addedが発生するので注意。
DataTableのGetChangesメソッドという、変更行を取得するメソッドに引っかかってしまいます。悪しからず。

2 件のコメント :

  1. 列の入れ替えもお願いします。

    返信削除
  2. 返信遅れてごめんなさい。
    匿名さん、コメントありがとうございます。
    列の入れ替えということですが、
    ①Table構造を作り直したものにちまちま全コピーする。
    ②入れ替えたい列と値を入れ替える。(型が同じだと値を入れ替えるだけかと)
    ③参照先で順番を工夫する。(A→B→Cという呼び出しをA→C→Bで呼ぶだけ)
    くらいでしょうか。

    返信削除