|
.NET TIPS [ASP.NET]DataGridコントロールのソートを双方向にするには?デジタルアドバンテージ2003/10/24 |
![]() |
|
|
|
DataGridコントロールのソート機能を使用すれば、グリッドで一覧表示された行を指定された列で並べ替えることができる。このための基本的な記述方法は「TIPS:DataGridコントロールにソート機能を追加するには?」で示しているが、Windowsのエクスプローラでの「詳細」表示のように、列名部分をクリックするたびに昇順/降順の並べ替えを交互に行うようにすればより便利になる。
「TIPS:DataGridコントロールにソート機能を追加するには?」で示したサンプル・プログラム(sortdg.aspx)に、このような双方向のソート機能を追加したプログラムは次のようになる。太字部分が修正を加えた部分である。
|
|
| 双方向のソートが可能なC#のサンプル・プログラム(reversedg.aspx) | |
このプログラムの実行画面は次のようになる。外見は元のプログラムと変わりないが、リンクボタンとなっている列名をクリックするたびに、昇順/降順の並び替えを切り替えられるようになっている。
![]() |
| サンプル・プログラム(reversedg.aspx)の実行結果 |
| 列名部分(「タイトル」や「日付」)をクリックするたびに、昇順/降順の並び替えが切り替わる。この画面は「タイトル」で降順にソートしたところ。 |
双方向のソート機能を実現するために追加したコードには2つのポイントが含まれている。
データビューの降順ソート
まず最初のポイントとなるのは、データソースとしているデータテーブル(DataTableオブジェクト)のデータを降順(逆順)に並べ替えるための記述だ。
元になったサンプル・プログラム(sortdg.aspx)では、次のようなコードでソートされたデータビュー(DataViewオブジェクト)を作成し、DataGridコントロールのデータソースとしていた。
DataTable dt = MakeDataTable();
DataView dv = dt.DefaultView;
dv.Sort = e.SortExpression;
この3行目では、e.SortExpressionにデータテーブルの列名が代入されており、実際には、例えば次のようなコードが実行されることになる。
dv.Sort = "title";
この1行によりデータビュー内の行は「title」列のデータにより「昇順」に並べ替えられるわけだが、この記述は次のものと同等である。
dv.Sort = "title ASC";
文字列の最後に追加している「ASC」は昇順(ascending)での並べ替えを指定するもので、昇順の場合にはこの「ASC」を省略することができる。
逆に、データビューを降順(descending)で並べ替えるには、「ASC」の代わりに「DESC」を指定すればよい。
dv.Sort = "title DESC";
列ごとの並べ替え方向の保持
グリッドの列名がクリックされるたびに並べ替えの方向を反転させるためには、列ごとに現在の方向(昇順か降順か)を、セッションをまたがって保持しておく必要がある。これが第2のポイントだ。今回はその保存場所としてページのViewStateプロパティを使用している。
ViewStateプロパティは、キーとそれに対する値のペアを複数保持することができる。今回のプログラムでは、列名がクリックされたときに「e.SortExpression」により得られるソート対象となる列の名前をViewStateプロパティのキーとし、その値として「ASC」あるいは「DESC」という文字列を読み書きしている。これを行っているのが次のコード部分だ。
string sortColumn = e.SortExpression;
string curSortOrder = (string)ViewState[sortColumn];
string newSortOrder = "";
if (curSortOrder == null || curSortOrder == "DESC") {
newSortOrder = "ASC";
} else {
newSortOrder = "DESC";
}
ViewState[sortColumn] = newSortOrder;
これは例えば、「タイトル」列がクリックされたとき、現在のViewState["title"]の値が「DESC」であれば、それを「ASC」に反転して保存する。なお、上記のコードで「curSortOrder == null」となるのはページが初めてアクセスされた場合だ。
そして続く次のコードにより、いまの例ではデータビューのSortプロパティに「title ASC」を設定して、データソースとなるデータのソートを行なう。
DataTable dt = MakeDataTable();
DataView dv = dt.DefaultView;
dv.Sort = sortColumn + " " + newSortOrder;
■
以上でグリッドの行を双方向にソートできるようになったが、これだけでは現在どの列でどちらの方向に並べ替えが行われているのかが分かりにくい。この対処については「TIPS:[ASP.NET]DataGridコントロールのヘッダーにソートされた方向を表示するには?」で解説している。![]()
| カテゴリ:Webフォーム 処理対象:DataGridコントロール 使用ライブラリ:DataGridコントロール 関連TIPS:[ASP.NET]DataGridコントロールにソート機能を追加するには? 関連TIPS:[ASP.NET]DataGridコントロールのヘッダーにソートされた方向を表示するには? |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -



