[C#][ListView]ListViewの列ヘッダクリックでソート | Assertion Failed!

[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();
}