[C#][ListView]ListViewの列ヘッダクリックでソート
ListViwの列ヘッダをクリックすることでソートを行う
ListViewコンポーネントのListViewItemSorterプロパティに、IComparerインタフェースを
実装したクラスを設定する。
※ ListViewのViewプロパティはDetailsに設定する
↓のようなクラスを作成。
public class ListViewColumnSorter : IComparer
{
#region フィールド
/// <summary>
/// ソート対象列
/// </summary>
private int _columnToSort;
/// <summary>
/// ソートオーダー
/// </summary>
private SortOrder _orderOfSort;
/// <summary>
/// 比較オブジェクト
/// </summary>
private CaseInsensitiveComparer _objectCompare;
#endregion
#region プロパティ
/// <summary>
/// ソート対象列
/// </summary>
public int SortColumn
{
get { return _columnToSort; }
set { _columnToSort = value; }
}
/// <summary>
/// ソートオーダー
/// </summary>
public SortOrder Order
{
get { return _orderOfSort; }
set { _orderOfSort = value; }
}
#endregion
#region メソッド
/// <summary>
/// コンストラクタ
/// </summary>
public ListViewColumnSorter()
{
_orderOfSort = SortOrder.None;
_objectCompare = new CaseInsensitiveComparer(CultureInfo.CurrentUICulture);
}
/// <summary>
/// IComparerインターフェース実装
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int Compare(object x, object y)
{
int result = 0;
ListViewItem listViewX = x as ListViewItem;
ListViewItem listViewY = y as ListViewItem;
result = _objectCompare.Compare(
listViewX.SubItems[_columnToSort].Text, listViewY.SubItems[_columnToSort].Text);
if (_orderOfSort == SortOrder.Ascending)
{
return result;
}
else if (_orderOfSort == SortOrder.Descending)
{
return (-result);
}
else
{
return 0;
}
}
#endregion
}
■使い方
private ListViewColumnSorter _columnSorter;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_columnSorter = new ListViewColumnSorter();
listView1.ListViewItemSorter = _columnSorter;
}
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == _columnSorter.SortColumn)
{
if (_columnSorter.Order == SortOrder.Ascending)
{
_columnSorter.Order = SortOrder.Descending;
}
else
{
_columnSorter.Order = SortOrder.Ascending;
}
}
else
{
_columnSorter.SortColumn = e.Column;
_columnSorter.Order = SortOrder.Ascending;
}
listView1.Sort();
}