ソートとかしたいだけなら、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メソッドという、変更行を取得するメソッドに引っかかってしまいます。悪しからず。
列の入れ替えもお願いします。
返信削除返信遅れてごめんなさい。
返信削除匿名さん、コメントありがとうございます。
列の入れ替えということですが、
①Table構造を作り直したものにちまちま全コピーする。
②入れ替えたい列と値を入れ替える。(型が同じだと値を入れ替えるだけかと)
③参照先で順番を工夫する。(A→B→Cという呼び出しをA→C→Bで呼ぶだけ)
くらいでしょうか。