比如有三列,姓名 性别 年龄,我单击其中某一列的表头,就按那一列的顺序排,怎么弄?网上找了些,看的不是很明白

解决方案 »

  1.   

    #region ListView排序类
    /// <summary>
    /// ListView排序类
    /// </summary>
    public class ListViewItemComparer : IComparer 
    {
    private int col;
    private SortOrder order; public ListViewItemComparer() 
    {
    col=0;
    order = SortOrder.Ascending;
    }
    public ListViewItemComparer(int column , SortOrder order) 
    {
    col=column;
    this.order = order;
    }
    public int Compare(object x, object y) 
    {
    int returnVal = -1;
    returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,((ListViewItem)y).SubItems[col].Text); if(order == SortOrder.Descending)
    returnVal *= -1 ;
    return returnVal;
    }
    }
    #endregion
    调用:
    private int sortColumn = -1;
    private void lvGroupDetail_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
    {
    if( e.Column < 4 ) //前3列可以排序
    {
    if (e.Column != sortColumn)
    {
    sortColumn = e.Column;
    lvGroupDetail.Sorting = SortOrder.Ascending;
    }
    else
    {
    if (lvGroupDetail.Sorting == SortOrder.Ascending)
    lvGroupDetail.Sorting = SortOrder.Descending;
    else
    lvGroupDetail.Sorting = SortOrder.Ascending;
    }

    this.lvGroupDetail.ListViewItemSorter = new Comm.Functions.ListViewItemComparer(e.Column ,lvGroupDetail.Sorting ) ;
    lvGroupDetail.Sort();
    }
    }
      

  2.   


    #region 关于排序的类
    /// <summary>
    /// 对列表视图的项进行排序(升序)
    /// </summary>//col为要排序的列索引,cla为点击以后排序的数据类型,1为文本,2为数字,3为日期
    public class UserListSortA : IComparer 
    {
    private int col,cla;
    public UserListSortA() 
    {
    col=0;
    }
    public UserListSortA(int column) 
    {
    col=column;
    }
    public UserListSortA(int Column,int Class)
    {
    col=Column;
    cla=Class;
    } public int Compare(object x, object y) 
    {
    int a=0;

    if(cla==1)
    {
    try
    {
    return String.Compare(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text, ((System.Windows.Forms.ListViewItem)y).SubItems[col].Text);
    }
    catch
    {
    return 0;
    }
    }
    else
    {
    if(cla==2)
    {
    try
    {
    if(decimal.Parse (((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)==decimal.Parse (((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 0;
    if(decimal.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)>decimal.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 1;
    if(decimal.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)<decimal.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a=-1;
    return a;
    }
    catch
    {
    return 0;
    }
    }
    else
    {
    try
    {
    if(DateTime.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)==DateTime.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 0;
    if(DateTime.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)>DateTime.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 1;
    if(DateTime.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)<DateTime.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a=-1;
    return a;
    }
    catch
    {
    return 0;
    }
    }
    }

    }
    } /// <summary>
    /// 对列表视图的项进行排序(降序)
    /// </summary>
    //col为要排序的列索引,cla为点击以后排序的数据类型,1为文本,2为数字,3为日期
    public class UserListSortD : IComparer 
    {
    private int col,cla;
    public UserListSortD() 
    {
    col=0;
    }
    public UserListSortD(int column) 
    {
    col=column;
    }
    public UserListSortD(int Column,int Class)
    {
    col=Column;
    cla=Class;
    } public int Compare(object x, object y) 
    {
    int a=0;

    if(cla==1)
    {
    try
    {
    return String.Compare(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text, ((System.Windows.Forms.ListViewItem)x).SubItems[col].Text);
    }
    catch
    {
    return 0;
    }
    }
    else
    {
    if(cla==2)
    {
    try
    {
    if(decimal.Parse (((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)==decimal.Parse (((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 0;
    if(decimal.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)<decimal.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 1;
    if(decimal.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)>decimal.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a=-1;
    return a;
    }
    catch
    {
    return 0;
    }
    }
    else
    {
    try
    {
    if(DateTime.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)==DateTime.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 0;
    if(DateTime.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)<DateTime.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a= 1;
    if(DateTime.Parse(((System.Windows.Forms.ListViewItem)x).SubItems[col].Text)>DateTime.Parse(((System.Windows.Forms.ListViewItem)y).SubItems[col].Text))
    a=-1;
    return a;
    }
    catch
    {
    return 0;
    }
    }
    }

    }
    }
    #endregion 
    //调用的函数
    /// <summary>
            /// 对选定的列表视图进行按点击的列排序
            /// </summary>
            /// <param name="L">列表</param>
            /// <param name="id">升序或降序</param>
            /// <param name="eColumn">点击的列索引</param>
            /// <param name="cla">单击列的数据类型数组,以列索引为序,1为文本,2 为数字,3为日期</param>
            public static void paixu(System.Windows.Forms.ListView L, int id, int eColumn, int[] cla)
            {
                if (L.View == View.Details)
                {
                    if (id % 2 == 0)
                        //倒序
                        L.ListViewItemSorter = new fun.UserListSortD(eColumn, cla[eColumn]);                else
                        //升序
                        L.ListViewItemSorter = new fun.UserListSortA(eColumn, cla[eColumn]);                L.Sort();
                }
            }//点击列标题事件
     private void listView3_ColumnClick(object sender, ColumnClickEventArgs e)
            {
                lis++;
                //排序
                module.ggmk.paixu(this.listView3, lis, e.Column, dataclass1 );
               //dataclass1是开始定义的一个所有列的类型数组,文本1数字2日期为3
                //module.ggmk.backcolor(this.listView3);
            }