読者です 読者をやめる 読者になる 読者になる

DataTable のレコードのソート

DataTable クラスのメソッドにレコードのソートなどといったメソッドがなく、力ずくでやるしかないように見えますが、
実はちゃんと佳い方法が用意されています。

それは DataView クラスを使う方法です。
DataView というのは MVC の V にあたります。V というのは View のことで、データをユーザーに視せる役割を持っています。
なので、元々の DataTable オブジェクトを元に DataView オブジェクトを作成し、中身のデータを加工するという方法をとります。

DataView view = new DataView( table );

DataView オブジェクトを table を 1 つ渡して作成します。
この table は野菜の貯蔵庫に入っている野菜のリストだとしましょう。
これから、各野菜の最も新鮮なものを知りたいとします。
これは列の「新鮮度」が高ければ高いほど新鮮な野菜なので、「新鮮度」をソートキーにすればよさそうですね。
その様にするには、次のように Sort プロパティにソートする列名を表す文字列を渡します。

view.Sort = "新鮮度";

これは SQL 文で云う order by に似ています。
今回は列が 1 つだったので「新鮮度」だけでしたが、他の列もソートキーにしたい場合はコンマ(,)で列を区切ります。

さあ、これで view の中は新鮮度でソートされました。
そのまま view を DataGridView オブジェクトの DataSource プロパティに渡すこともできますが、
やはり、ソートされたデータテーブルを取得したいというのが人情というものでしょう(そうか?)。

その時に使うのが ToString ならぬ ToTable メソッドです。
この ToTable メソッドは現在の DataView オブジェクトに基づく行を持った DataTable オブジェクトを新しく作成して返します。
繰り返しますが、DataView のコンストラクタで渡した table と同じオブジェクトではありません。
1 行例文では同じ table という変数に返り値を代入していますが、これはもう 1 つ変数を宣言するのがめんどくさいからです。

table = view.ToTable();

その他の方法

DataTable のメソッドに DafaultView というプロパティがあり、これは DataView 型なので、
このビューの設定がレシーバに反映されるのかどうかは不明ですが上記で書いたのと同じ事が可能です。