ListViewコントロールのカラムヘッダをクリックした際に、その列を昇順または降順でソートするサンプルコードです。
準備
フォーム上にリストビューを配置しておく。名前はlistView1とする。
サンプルコード
クリックされたカラムが現在ソートされているカラムと同じかどうかをチェックし、同じ場合はソート方向を反転させます。異なるカラムがクリックされた場合は、昇順でソートします。
using System;
using System.Collections;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// リストビュー初期化
InitializeListView();
}
// リストビュー初期化
private void InitializeListView()
{
// リストビューのプロパティ設定
listView1.View = View.Details;
listView1.FullRowSelect = true;
// カラムヘッダの初期化
listView1.Columns.Add("ID", -2, HorizontalAlignment.Left);
listView1.Columns.Add("Name", -2, HorizontalAlignment.Left);
listView1.Columns.Add("Date", -2, HorizontalAlignment.Left);
// カラムクリックイベントにハンドラを割り当て
listView1.ColumnClick += new ColumnClickEventHandler(listView1_ColumnClick);
// ListViewItemSorterに、ListViewColumnSorterを設定
listView1.ListViewItemSorter = new ListViewColumnSorter();
// データの追加(サンプルデータ)
listView1.Items.Add(new ListViewItem(new string[] { "1", "Item 1", "2023/01/01" }));
listView1.Items.Add(new ListViewItem(new string[] { "2", "Item 2", "2023/01/02" }));
listView1.Items.Add(new ListViewItem(new string[] { "3", "Item 3", "2023/01/03" }));
}
// カラムクリックイベントハンドラ ★
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
var sorter = listView1.ListViewItemSorter as ListViewColumnSorter;
// クリックされたカラムが現在ソートされているカラムと同じ場合は、ソート方向を反転させる
if (e.Column == sorter.SortColumn)
{
sorter.Order = sorter.Order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;
}
else
{
// 新しいカラムでのソートを開始する場合は、昇順でソート
sorter.SortColumn = e.Column;
sorter.Order = SortOrder.Ascending;
}
// ソートを実行
listView1.Sort();
}
// カスタムComparerクラス ★
class ListViewColumnSorter : IComparer
{
public int SortColumn { get; set; }
public SortOrder Order { get; set; }
// コンストラクタ
public ListViewColumnSorter()
{
SortColumn = 0;
Order = SortOrder.Ascending;
}
// 比較
public int Compare(object x, object y)
{
ListViewItem item1 = (ListViewItem)x ;
ListViewItem item2 = (ListViewItem)y;
string text1 = item1.SubItems[SortColumn].Text;
string text2 = item2.SubItems[SortColumn].Text;
// 文字列として比較
int result = String.Compare(text1, text2);
// 降順の場合は結果を反転
if (Order == SortOrder.Descending)
{
result = -result;
}
return result;
}
}
}
}
まとめ
本記事では、Windowsフォームアプリケーションにおいて、リストビューのカラムヘッダをクリックすることにより、リストビューの内容をソートする方法を紹介しました。