C#中listview实现排序

【问题】:当点击列标题的时候,能够完成对该列排序,再次点击,按照该列反序排序。

 

【解决方法】:

使用IComparer接口

 

例子:

1.using System;

using System.Collections.Generic;

using System.Text;

using System.Collections;

using System.Windows.Forms;

namespace sortListView

{

  class ListViewColumnSorter: IComparer

  {      

    private int ColumnToSort;// 指定按照哪个列排序  

    private SortOrder OrderOfSort;// 指定排序的方式          

    private CaseInsensitiveComparer ObjectCompare;// 声明CaseInsensitiveComparer类对象,

    public ListViewColumnSorter()// 构造函数

    {        

        ColumnToSort = 0;// 默认按第一列排序    

        OrderOfSort = SortOrder.None;// 排序方式为不排序        

      ObjectCompare = new CaseInsensitiveComparer();// 初始化CaseInsensitiveComparer类对象

    }  

    // 重写IComparer接口.    

      // 比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1

    public int Compare(object x, object y)

    { int compareResult;

        ListViewItem listviewX, listviewY;

        // 将比较对象转换为ListViewItem对象

        listviewX = (ListViewItem)x;

        listviewY = (ListViewItem)y;

        // 比较

        compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);

      // 根据上面的比较结果返回正确的比较结果

        if (OrderOfSort == SortOrder.Ascending)

        { // 因为是正序排序,所以直接返回结果

            return compareResult;

        }

        else if (OrderOfSort == SortOrder.Descending)

        { // 如果是反序排序,所以要取负值再返回

            return (-compareResult);

        }

        else

        {

            // 如果相等返回0

            return 0;

        }

    }    

    /// 获取或设置按照哪一列排序.    

    public int SortColumn

    {           set

        {     ColumnToSort = value;

        }

        get

        {

            return ColumnToSort;

        }

    }    

    /// 获取或设置排序方式.  

    public SortOrder Order

    {   set

        {

            OrderOfSort = value;

        }

        get

        {

            return OrderOfSort;

        }

    }   }}

================================

namespace sortListView

{

  public partial class Form1 : Form

  {

   

      public Form1()

      {

        InitializeComponent();        

          // 创建一个ListView排序类的对象,并设置listView1的排序器

        lvwColumnSorter = new ListViewColumnSorter();

        this.listView1.ListViewItemSorter = lvwColumnSorter;

      }

    private void Form1_Load(object sender, EventArgs e)

      { 初始化listview1.

      }

      private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)

    { // 检查点击的列是不是现在的排序列.

        if (e.Column == lvwColumnSorter.SortColumn)

        {

        // 重新设置此列的排序方法.

            if (lvwColumnSorter.Order == SortOrder.Ascending)

            {   lvwColumnSorter.Order = SortOrder.Descending;

            }

            else

            {   lvwColumnSorter.Order = SortOrder.Ascending;

            }

        }

        else

        {

            // 设置排序列,默认为正向排序

            lvwColumnSorter.SortColumn = e.Column;

            lvwColumnSorter.Order = SortOrder.Ascending;

        }

      // 用新的排序方法对ListView排序

        this.listView1.Sort();      

    }

    private void button1_Click(object sender, EventArgs e)

    {

        Form2 obj = new Form2();

        obj.Show();

    }   }}

你可能感兴趣的:(Windows,C#)