web-dev-qa-db-ja.com

DataTable.DefaultView.Sortがソートされない

DataTable.DefaultView.Sortで混乱しています。これが、使用したいコードのセグメントです。

actionLogDT.DefaultView.Sort = "StartDate";

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

私が見たサンプルはforeachループを使用していないため、これを処理する方法について混乱しています。思ったとおりに並べ替えられていません。

.DefaultViewがビューを返し、.Tableがコンパイルエラーを返すことがわかります。

17
Mike Wills

私は少し異なるアプローチを取る必要がありました。 この投稿 は、コードを機能させるために私が見つけた最も近いものでした。これが作業結果です:

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

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

そこから、値を適切な型にキャストし直す必要があります。

(string)logRow["Status"].ToString()
7
Mike Wills
actionLogDT.DefaultView.Sort = "StartDate";

actionLogDT = actionLogDT.DefaultView.ToTable();
29
ashdiggedy

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

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

さらに、レコードをループ処理したいと思ったので、dataRowViewDefaultViewオブジェクトをループ処理するだけで済みます。

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();
}
3
Kevin Cain
foreach (var logRow in actionLogDT.DefaultView.ToDataTable()) { ... }
3
John Sheehan

これを試してください:

actionLogDT.DefaultView.Sort = "["+actionLogDT.Columns[0].ColumnName+"] asc";
1
Upender

データテーブルを戻す必要がある場合は、次のようなことができます。

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

actionLogDT = dv.ToTable();
0
Adi Bilauca

気になるところ:なぜDataRowViewを使用しているのですか?

つまり.

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