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;
   }
  }