ListView排序总结

ListView的排序还存在一个问题没有解决,当第一列为序号时,要始终保持序号为升序,应该怎样解决?

当Column为动态时,排序会报错,把//this.listView1.ListViewItemSorter = null;放在更新Column之前,就可以解决!

private int CurrentColumn = -1; //记录上次点击的列号
private bool b_Convert = false; //记录正逆序信息
private void listView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
    if (e.Column == CurrentColumn)
    {
        b_Convert = !b_Convert;
        if (e.Column == 3 || e.Column == 0)
            this.listView1.ListViewItemSorter = new SortBySubItem(e.Column, b_Convert, 1);//数值排序
        else
            this.listView1.ListViewItemSorter = new SortBySubItem(e.Column, b_Convert);//字符排序
    }
    else
    {
        CurrentColumn = e.Column;
        b_Convert = false;
        if (e.Column == 3 || e.Column == 0)
            this.listView1.ListViewItemSorter = new SortBySubItem(e.Column, b_Convert, 1);
        else
            this.listView1.ListViewItemSorter = new SortBySubItem(e.Column, b_Convert);
    }
}
 
public class SortBySubItem : System.Collections.IComparer
{
    private int m_Column = 0;
    private int m_SortType = 0;//排序类型
    private bool m_asc = true;

    public SortBySubItem(int Column, bool bAsc)
    {
        m_Column = Column;
        m_asc = bAsc;
    }

    public SortBySubItem(int Column, bool bAsc, int SortType)
    {
        m_Column = Column;
        m_SortType = SortType;
        m_asc = bAsc;
    }

    int IComparer.Compare(object x, object y)
    {
        string item1 = ((ListViewItem)x).SubItems[m_Column].Text.Trim();
        string item2 = ((ListViewItem)y).SubItems[m_Column].Text.Trim();
        int intSort = 0;
        if (!m_asc)//反序
        {
            string temp = item1;
            item1 = item2;
            item2 = temp;
        }

        if (m_SortType == 0)   //字符排序
            intSort = String.Compare(item1, item2);
        else      //数值排序
        {
            double str1 = 0;
            double str2 = 0;
            if (item1 == "")//为空设置为最小
                return 1;
            else if (item2 == "")
                return 0;
            try
            {
                str1 = double.Parse(item1);
                str2 = double.Parse(item2);
            }
            catch
            {
                //转换出错
                return 0;
            }
            if (str1 >= str2)
                return 0;
            else
                return 1;

        }
        return intSort;
    }
}
Contributors: FHL