给VS2005的ListView添加排序功能

28 篇文章 0 订阅

VS2005的ListView控件居然没有点击列头排序的功能 ,查了MSDN发现了排序的方法,但是缺点就是没有象DataGridView的列头一样的那种三角形,这个是控件界面的问题,实现了功能也就无所谓了。

先写一个排序的类:

using  System.Windows.Forms;

/// <summary>
/// This class is an implementation of the 'IComparer' interface.
/// </summary>

public   class  ListViewColumnSorter : IComparer
{
    
/// <summary>
    
/// Specifies the column to be sorted
    
/// </summary>

    private int ColumnToSort;
    
/// <summary>
    
/// Specifies the order in which to sort (i.e. 'Ascending').
    
/// </summary>

    private SortOrder OrderOfSort;
    
/// <summary>
    
/// Case insensitive comparer object
    
/// </summary>

    private CaseInsensitiveComparer ObjectCompare;

    
/// <summary>
    
/// Class constructor.  Initializes various elements
    
/// </summary>

    public ListViewColumnSorter()
    
{
        
// Initialize the column to '0'
        ColumnToSort = 0;

        
// Initialize the sort order to 'none'
        OrderOfSort = SortOrder.None;

        
// Initialize the CaseInsensitiveComparer object
        ObjectCompare = new CaseInsensitiveComparer();
    }


    
/// <summary>
    
/// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
    
/// </summary>
    
/// <param name="x">First object to be compared</param>
    
/// <param name="y">Second object to be compared</param>
    
/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>

    public int Compare(object x, object y)
    
{
        
int compareResult;
        ListViewItem listviewX, listviewY;

        
// Cast the objects to be compared to ListViewItem objects
        listviewX = (ListViewItem)x;
        listviewY 
= (ListViewItem)y;

        
// Compare the two items
        compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);
            
        
// Calculate correct return value based on object comparison
        if (OrderOfSort == SortOrder.Ascending)
        
{
            
// Ascending sort is selected, return normal result of compare operation
            return compareResult;
        }

        
else if (OrderOfSort == SortOrder.Descending)
        
{
            
// Descending sort is selected, return negative result of compare operation
            return (-compareResult);
        }

        
else
        
{
            
// Return '0' to indicate they are equal
            return 0;
        }

    }

    
    
/// <summary>
    
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
    
/// </summary>

    public int SortColumn
    
{
        
set
        
{
            ColumnToSort 
= value;
        }

        
get
        
{
            
return ColumnToSort;
        }

    }


    
/// <summary>
    
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
    
/// </summary>

    public SortOrder Order
    
{
        
set
        
{
            OrderOfSort 
= value;
        }

        
get
        
{
            
return OrderOfSort;
        }

    }

    
}

然后在有ListView的窗体代码里给ListView写一个列头点击事件:

         private   void  listView1_ColumnClick( object  sender, ColumnClickEventArgs e)
        
{
            
if (e.Column == this.sorter.SortColumn)
            
{
                
if (this.sorter.SortOrder == SortOrder.Ascending)this.sorter.SortOrder = SortOrder.Descending;
                
else if (this.sorter.SortOrder == SortOrder.Descending)this.sorter.SortOrder = SortOrder.Ascending;
                
else return;
            }

            
else
            
{
                
this.sorter.SortColumn = e.Column;
            }

            
this.listView1.Sort();
        }

再在窗体代码里面的构造函数里面给ListView加入排序的方法:

 

         public  FrmOption()
        
{
            InitializeComponent();

            sorter 
= new ListViewColumnSorter();
            
//为ListViewItemSorter指定排序类
            this.listView1.ListViewItemSorter = sorter;
            sorter.SortOrder 
= SortOrder.Ascending;

            
this.listView2.ListViewItemSorter = sorter;
            sorter.SortOrder 
= SortOrder.Ascending;

        }

接下来运行窗体,点击ListView的列头,是不是可以排序了。

参考微软的文章:“如何按 Visual C# 中列排序 ListView 控件”

地址是:http://support.microsoft.com/kb/319401/zh-cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值