ListView排序
日期: 2010-01-20 类别: 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; }
Stat.