公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路 ?
直接放上代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TestListView
{
public partial class ListViewEx : ListView
{
protected override void OnColumnClick(ColumnClickEventArgs e)
{
if (this.ListViewItemSorter == null)
{
this.ListViewItemSorter = new ListViewItemComparer(e.Column, SortOrder.Ascending);
}
else
{
ListViewItemComparer comparer = this.ListViewItemSorter as ListViewItemComparer;
if (comparer.SortColumn == e.Column)
{
if (comparer.Order == SortOrder.Ascending)
{
comparer.Order = SortOrder.Descending;
}
else
{
comparer.Order = SortOrder.Ascending;
}
}
else
{
comparer.SortColumn = e.Column;
comparer.Order = SortOrder.Ascending;
}
this.Sort();
}
}
private class ListViewItemComparer : System.Collections.IComparer
{
public int SortColumn
{
get;
set;
}
public SortOrder Order
{
get;
set;
}
/// <summary>
/// 比较器构造函数
/// </summary>
/// <param name="column"></param>
public ListViewItemComparer()
{
this.SortColumn = 0;
this.Order = SortOrder.None;
}
public ListViewItemComparer(int column)
: this()
{
this.SortColumn = column;
}
public ListViewItemComparer(int column, SortOrder sortOrder)
: this(column)
{
this.Order = sortOrder;
}
/// <summary>
/// 实现比较器接口的方法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
int System.Collections.IComparer.Compare(object x, object y)
{
int result = string.Compare(((ListViewItem)x).SubItems[this.SortColumn].Text, ((ListViewItem)y).SubItems[this.SortColumn].Text);
if (this.Order == SortOrder.Ascending)
{
return result;
}
else if (this.Order == SortOrder.Descending)
{
return (-result);
}
else
{
return 0;
}
}
}
}
}