ListView排序

类别: C# 查看评论

实现点击ListView的Header的时候对ListView排序

1. 添加个ListView控件,Name为lvLogsListView的HeaderStyle属性为Clickable,给Columns添加几列,例如Timestamp,Level,Messange。
2. ListView提供了Sort方法,但是需要自己实现ListViewItemSorter。定义一个继承自接口IComparerListViewColumnSorter的类,并实现Compare

internal class ListViewColumnSorter : IComparer
{
    private int _column; // 需要排序的列
    private SortOrder _order; // 排序方式
    private const string timeStampText = "Timestamp";
 
    // 默认构造函数,默认第一列,不排序
    public ListViewColumnSorter()
        : this(0, SortOrder.None)
    {
    }
 
    public ListViewColumnSorter(int column, SortOrder direction)
    {
        _column = column;
        _order = direction;
    }
 
    // 重写IComparer接口
    public int Compare(object x, object y)
    {
        // 将要比较的两个对象转换为ListViewItem类型
        ListViewItem itemX = (ListViewItem)x;
        ListViewItem itemY = (ListViewItem)y;
        int result;
 
        // 如果该列是日期/时间,则转换成时间在进行比较
        if (itemX.ListView.Columns[_column].Text.Equals(timeStampText))
        {
            DateTime dtx = DateTime.Parse(itemX.SubItems[_column].Text);
            DateTime dty = DateTime.Parse(itemY.SubItems[_column].Text);
            result = DateTime.Compare(dtx, dty);
        }
        else// 如果不是,按照字符串做比较
        {
            result = itemX.SubItems[_column].Text.CompareTo(itemY.SubItems[_column].Text);
        }
 
        if (_order == SortOrder.Ascending)// 如果按升序排序,直接返回结果
        {
            return result;
        }
        else if (_order == SortOrder.Descending)// 如果按降序,取负值在返回
        {
            return -result;
        }
        else// 如果不排序,返回0
        {
            return 0;
        }
    }
}

3. 在ListView的ColumnClick事件中添加代码,实例化一个ListViewColumnSorter,并赋值给ListView的ListViewItemSorter属性,然后调用Sort方法排序

private void lvLogs_ColumnClick(object sender, ColumnClickEventArgs e)
{
    // 定义个SortOrder类型的字段,记录当前ListView的排序方式
    SortOrder order = this.lvLogs.Sorting;
    // 如果当前排序是降序或者未排序,则排序方式为升序
    if (order == SortOrder.None || order == SortOrder.Descending)
    {
        order = SortOrder.Ascending;
    }
    else// 否则为降序
    {
        order = SortOrder.Descending;
    }
 
    // 实例化ListViewColumnSorter,并传入需要排序的列的序号和排序方式
    ListViewColumnSorter sorter = new ListViewColumnSorter(e.Column, order);
    // 把这个ListViewColumnSorter 赋值给ListView的ListViewItemSorter属性
    this.lvLogs.ListViewItemSorter = sorter;
    // 调用ListView的Sort方法排序
    this.lvLogs.Sort();
    // 把当前的排序方式赋值给ListView的Sorting属性
    this.lvLogs.Sorting = order;
}

发表评论