2009-07-30 16 views
13

DataTable.DefaultView.Sortで混乱します。ここで私はそれを使用するコードのセグメントがある。DataTable.DefaultView.Sortがソートしない

actionLogDT.DefaultView.Sort = "StartDate"; 

foreach (CustomerService.ActionLogStartEndRow logRow in actionLogDT) 
{ 
    // code here 
} 

私が見てきたサンプルは、foreachループを使用していないので、これを処理する方法で私を混乱さ。それは私がそれがすべきだと思ったようにソートされていません。

.DefaultViewはビューを返し、.Tableはコンパイルエラーを返します。

+0

あなたの質問/混乱は何ですか?どのようなコンパイルエラーが表示されますか? – shahkalpesh

+1

ソートされていません。 –

+2

日付列をソートする場合、その列はDataTableのDateTimeとして定義する必要があります。それ以外の場合は、文字列として扱われ、予期しない順序でソートされます。 – DOK

答えて

7

私は少し異なるアプローチを取る必要がありました。 This postが私のコードを動作させるのに最も近いものでした。ここに作業結果があります:

actionLogDT.DefaultView.Sort = "StartDate"; 
DataView dv = actionLogDT.DefaultView; 

foreach (DataRowView logRow in dv) { . . . } 

そこから、値を適切な型にキャストするだけです。

(string)logRow["Status"].ToString() 
+0

キャストは冗長です... '.ToString()'で十分です。 – vapcguy

10

ビューを並べ替えても、テーブル内のデータのソート順は変わりません。ビュー内の順序だけが変更されます。ビューの代わりにforeachを実行し、行をDataRowViewから厳密に型指定された行にキャストして戻すと機能するはずです。

foreach (DataRowView logRowView in actionLogDT.DefaultView) 
{ 
    CustomerService.ActionLogStartEndRow logRow = logRowView.Row as CustomerService.ActionLogStartEndRow; 
    // code here 
} 
+0

これを実行すると、「 'System.Data.DataRowView'タイプのオブジェクトをキャストして 'ActionLogStartEndRow'を入力できません。」エラー。 –

+0

'ActionLogStartEndRow'はDataRowから派生していますか? –

+0

@Jeromy - それは確信しています。私はこのすべてを達成するために.XSDデータレイヤーを使用しています。 –

3
foreach (var logRow in actionLogDT.DefaultView.ToDataTable()) { ... } 
0

興味があるだけ:なぜあなたはDataRowViewを使用していますか?それ以来、

さらに
var dv = actionLogDT.DefaultView; 
dv.Sort = "StartDate"; 

actionLogDT = dv.ToTable(); 
+1

私はあなたの質問を理解していません。 –

+1

質問は、データテーブルをソートすることに関するものでした。並べ替えられたデータを列挙するには、テーブル自体ではなく、ビューを列挙する必要があります。 –

1

すなわち

はこれを試してみてくださいあなたがループしたいと思ったようですレコードの場合は、DefaultViewのオブジェクトdataRowViewをループすることができます。

foreach (DataRowView drv in table.DefaultView) 
{ 
    string strValue = drv["ColumnName"].ToString(); 
    // its also worth mentioning that a DataRowView has a Row 
    strValue = drv.Row["ColumnName"].ToString(); 
} 
+0

次回私はこの問題を抱えています。 –

22
actionLogDT.DefaultView.Sort = "StartDate"; 

actionLogDT = actionLogDT.DefaultView.ToTable(); 
+1

ありがとうございます!ちょうど私が必要なもの。テーブルを取得してソートし、それが特定の方法でソートされている間に使用します。 – Lukas

+0

シナリオや症状が少し違っていましたが、.toTable()がこれを解決しました。ありがとう。 私のケースでは、DefaultView.Sort式をうまく適用していて、DropDownListのソートが有効になっているのを見ていましたが、DataGridには効果がありませんでした。 YMMV:これを適用するDataGridは、動的ソートなどを提供しない非常に基本的な読み取り専用テーブルです。 – storsoc

0

foreach (DataRow row in actionLogDT.Rows) 
{ 
    Console.WriteLine(row["Status"]); 
} 
3

:あなたがデータテーブルが必要な場合は当時あなたのような何かを行うことができます

actionLogDT.DefaultView.Sort = "["+actionLogDT.Columns[0].ColumnName+"] asc"; 
関連する問題