2016-03-19 11 views
-1

私は6列(S1、S2、S3はstringで、D1、D2、D3はdoubleです)のデータテーブル(dt)を持っています。データテーブルをソートして主キーを保持する方法は?

dt.PrimaryKey = new DataColumn[] 
{ dt.Columns["S1"], dt.Columns["S2"], dt.Columns["S3"] }; 

は今、私はD1、D2、D3によってdtをソートし、データテーブルとして保存したい:string列の組合せ(S1、S2、S3は)私の主キーを構成しています。 は、ここで私が得たものである:

DataView view = new DataView(dt); 
view.Sort = "D1, D2, D3"; 
dt = view.ToTable(); 

問題は、dtは、私は私のPrimaryKeysを失ったことで、私が望んでいた道をソートされています。私はdt = view.Table.Copy();で3番目の行を置き換えて、PrimaryKeysを保持しようとしましたが、ソートは機能しません。私もLINQHow to sort DataTable based on multiple column?)を使って試してみましたが、この傾向(DataTable.DefaultView.Sort Doesn't Sort)をチェックしましたが、どれもうまくいきませんでした。

何か間違っていますか?どんな助けも大歓迎です。

+1

view.Table.Copy後にDefaultView.Sortプロパティを設定しようとしましたか? – Steve

答えて

1

すべてのDataTableには、メインテーブルのコピーを作成せずに並べ替えを設定できるDefaultViewプロパティがあります。あなたがまだ作成したい場合は

あなたdesideredソート順にDefaultView.Sortプロパティを設定して、代わりのDataTableの[既定をループ場合は、正確な順序であなたの行を取得するには、

dt.DefaultView.Sort = "D1, D2, D3"; 
foreach(DataRowView dr in dt.DefaultView) 
    Console.WriteLine("D1=" + dr["D1"].ToString() + 
        ", D2=" + dr["D2"].ToString() + 
        ", D3=" + dr["D3"].ToString()); 

を必要と新しいテーブルは、あなたが

//Get the primarykey column names 
List<string> names = dt.PrimaryKey 
         .Cast<DataColumn>() 
         .Select(x => x.ColumnName) 
         .ToList(); 
// New table 
DataTable dt2 = dt.Copy(); 
// Get the array of datacolumns that match the name of the other table primary 
DataColumn[] keys = dt2.Columns 
         .Cast<DataColumn>() 
         .Where(x => names.Contains(x.ColumnName)) 
         .ToArray(); 

// Set the primary in the copied table 
dt2.PrimaryKey = keys; 
+0

ありがとうSteve。あなたのコードはうまくいきましたが、このソートされたバージョンを 'dt'や別のデータテーブルに保存したいのであれば、それをループする必要がありますか? – EhsanK

+0

結果を元のdt変数に代入すると、それを破棄して新しい変数を作成します。これはもちろん可能ですが、元のテーブルに設定されているPrimaryKeyを見たことがあります。ただし、主キーの列の名前を取得して新しいテーブルに再構築することができます – Steve

+0

例が追加されました。 – Steve

0

.....新しいテーブルの主キー列を再作成する必要が短い方法は次のとおりです。

var brandNewTable = dw.ToTable(); 
関連する問題