none
DataTable にソートがかからない。 RRS feed

  • 質問


  • DataTable に対して、以下のようにソートをかけても View がソートされるだけで、
    配列の実順序が変わりません。

    objDataTable.DefaultView.Sort = "AAAAA, BBBBB, CCCCC";
    objDataTable.Select();

    配列の実順序を整列させる方法を教えてください。

    よろしくお願いします。
    2009年5月8日 5:20

回答

  • Selectメソッドの戻り値はDaraRow[]になっていて、条件によってソートされたものが返ってきます。

    ソートした結果をDataTableにするのであれば、以下のようなcodesnippetで生成できると思います。

    var rows = dt.Select(String.Empty, "[AAAAA] Asc");
    DataTable newDt = dt.Clone();
    foreach (DataRow row in rows)
    {
        newDt.ImportRow(row);
    }//foreach
    2009年5月8日 6:11
  • DataTable の用途や、データの発生場所で回答が変わってくると思います。

    1) DataTable を直接使わずに DefaultView から間接的に使用する。
      DataTable を直接使うと削除した Row も拾ってきて例外が発生しますので DefaultView から間接的に使用する習慣にしたほうがいいと思います。
      DataGrid とかの UIで使うときも自動的に DataView 経由で表示されています。
    2) データベースから取得する場合は、 SELECT 文に ORDER BY をかける。
    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    2009年5月8日 6:21
  • DefaultViewからDataViewが得られます。DataViewはDataTableをどのように見せるかを管理するクラスです。つまりDataTableにソートやフィルタをかけたデータを提供します。元のDataTableには一切の変更を加えません。

    結果的にどのようなデータが必要なのかわかりませんが、例えば

    DataView dv = objDataTable.DefaultView;
    dv.Sort = "AAAAA, BBBBB, CCCCC";

    for (int i = 0; i < dv.Count; i++)
    {
          dv[i][カラムインデックス] ・・・
          dv[i]["カラム名"] ・・・
    }

    とすれば、ソート順のデータを得ることができます。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年5月8日 6:51
    モデレータ

すべての返信

  • Selectメソッドの戻り値はDaraRow[]になっていて、条件によってソートされたものが返ってきます。

    ソートした結果をDataTableにするのであれば、以下のようなcodesnippetで生成できると思います。

    var rows = dt.Select(String.Empty, "[AAAAA] Asc");
    DataTable newDt = dt.Clone();
    foreach (DataRow row in rows)
    {
        newDt.ImportRow(row);
    }//foreach
    2009年5月8日 6:11
  • DataTable の用途や、データの発生場所で回答が変わってくると思います。

    1) DataTable を直接使わずに DefaultView から間接的に使用する。
      DataTable を直接使うと削除した Row も拾ってきて例外が発生しますので DefaultView から間接的に使用する習慣にしたほうがいいと思います。
      DataGrid とかの UIで使うときも自動的に DataView 経由で表示されています。
    2) データベースから取得する場合は、 SELECT 文に ORDER BY をかける。
    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2009/12
    2009年5月8日 6:21
  • DefaultViewからDataViewが得られます。DataViewはDataTableをどのように見せるかを管理するクラスです。つまりDataTableにソートやフィルタをかけたデータを提供します。元のDataTableには一切の変更を加えません。

    結果的にどのようなデータが必要なのかわかりませんが、例えば

    DataView dv = objDataTable.DefaultView;
    dv.Sort = "AAAAA, BBBBB, CCCCC";

    for (int i = 0; i < dv.Count; i++)
    {
          dv[i][カラムインデックス] ・・・
          dv[i]["カラム名"] ・・・
    }

    とすれば、ソート順のデータを得ることができます。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年5月8日 6:51
    モデレータ

  • ありがとうございました!
    解決しました!
    2009年5月8日 7:30
  • こんにちは!フォーラムオペレーターの高橋 春樹です。

    GX999さん、えムナウさん、trapemiyaさん
    いつも大変お世話になってます!
    様々な方法を投稿して頂けると、より多くの方の参考になるので、助かります(^-^)

    den256さん、はじめまして!
    MSDNフォーラムのご利用ありがとうございます。

    解決したようなので問題ないと思いますが、
    情報を皆様と共有する為に、GX999さん、えムナウさん、trapemiyaさんの投稿に
    回答マークを付けさせてもらいました。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    2009年5月15日 5:19