【VB.NET】【WPF】ListView でのソート

MEMO

この記事は「【VB.NET】【WPF】ListView の基本的な使い方」の一部を別記事として独立させたものです。

この記事では下記のようなリストビューのソートについて解説しています。

コラムヘッダーのクリックイベントを用意する

ListView のコラムヘッダーをクリックして ListView のデータをソートするには、まずコラムヘッダーの Click イベントを用意する。

まず、コードに空の Click イベント実行関数を記述する(ListView を含むウィンドウのクラス内に記述)。

 

次に、「【VB.NET】【WPF】ListView の基本的な使い方」の記事で示した ListView の xaml に下記の Click イベントを追加します。

各列のクリックイベントの処理をまとめる

前述のコード(3つのイベント実行関数)から1つのソート処理関数を呼び出すように追記しましょう。次のように書き加えます。

クリックイベントの具体的な処理内容を記述する

前述の最後の関数(ScheduleSort)の中身を記述します(下記コードの1-2行目にグローバル変数も2つ追加しています)。

下記コード内の SortClass はまだ定義していないのでエラーになりますが、このあとで定義します。

IComparer を実装したソートクラスを定義する

そしてソートの心臓部である SortClass クラスを記述します。

これで ListView の各列をクリックするとソートできるはずです。実行して試してみてください。

月火水木金土日を正しくソートする

ソートできましたか?

えっ?「ソートできたけど、曜日の列のソート順が変だよ」って?

・・・そうでした。

「月火水木金土日」を普通にソートしても意図した通りに並んでくれないんですよね。

というわけで、意図した通りに並ぶように、前述の SortClass クラスの中に下記のディクショナリを追記して・・・

前述の SortClass の21行目を下記のように書き換えましょう。

これで意図した通りに曜日がソートされるようになりましたね。

コラムヘッダーに昇順・降順を示す▲▼を表示する

でもまだ何か足りないものがありますね。

このままだと、列ヘッダをクリックしても、現在どういう状態(昇順? 降順?)でソートされているのか分かりにくい。

というわけで、列ヘッダに昇順・降順を示す▲▼が表示されるようにしてみましょう。

リソースディクショナリに▲▼の記号を定義する

まず Visual Basic の上部メニューで[プロジェクト]>[リソース ディクショナリの追加]を選択してリソースディクショナリを追加します。

リソースディクショナリ(ここでは Dictionary1.xaml とします)に▲▼の記号を表す下記の xaml を記述します。

リソースディクショナリへの参照を定義する

次に、ウィンドウの xaml に下記(リソースディクショナリへの参照)を記述します(<Window ...> タグの下あたりに記述するのが良いでしょう)。

コードの追加

そして記号を表示できるように ScheduleSort 関数を書き換えます。下記のハイライト部分が変更箇所です。

 

3つのクリックイベントの実行関数も修正して、ScheduleSort の第1引数に sender (実体は GridViewColumnHeader)を指定します。

 

これで、まぁまぁイイ感じにソートできるようになったと思います。

ソート前

ソート後

 

 

コメントの投稿

avatar
  購読する  
通知を受け取る対象