【C#】リストビューのカラムヘッダをクリックでソート

C#

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;
            }
        }
    }
}
タイトルとURLをコピーしました