我的datagridview榜定了一些数据,但不是用dataset绑定,绑定后无法自动排序,上网查了下发现要写SortCompare,具体该如何写呢?

解决方案 »

  1.   

    DataGridView 列有三种排序模式。每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGridViewColumnSortMode 枚举值之一。DataGridViewColumnSortMode 值  说明  
    Automatic 
     文本框列的默认排序模式。除非将列标头用于选择,否则单击列标头将自动按此列对 DataGridView 排序,并显示一个指示排序顺序的标志符号。
     
    NotSortable 
     非文本框列的默认排序模式。可以以编程方式对此列排序;但此列不适合排序,因此未为排序标志符号保留空间。 
     
    Programmatic 
     可以以编程方式对此列排序;而且为排序标志符号保留了空间。
     如果默认为 NotSortable 的列包含的值可以有意义地排序,您可能希望更改该列的排序模式。例如,如果有一个数据库列包含表示项状态的数字,则可以通过将一个图像列绑定到该数据库列来将这些数字显示为相应的图标。然后可以在 System.Windows.Forms.DataGridView.CellFormatting 事件的处理程序中,将数值单元格值更改为图像显示值。在这种情况下,将 SortMode 属性设置为 Automatic 会使用户能够对该列排序。自动排序将使用户能够对具有相同状态的项分组,即使这些对应于数字的状态没有自然的顺序。复选框列也是自动排序对于将处于相同状态的项分组很有用的示例。可以以编程方式按任一列或多列中的值对 DataGridView 排序,而不论 SortMode 设置如何。当希望为排序提供自己的用户界面 (UI) 时,或者当希望实现自定义排序时,以编程方式排序很有用。提供自己的排序用户界面非常有用,例如,在设置 DataGridView 选择模式以启用列标头选择时。在这种情况下,虽然列标头不能用于排序,但是仍希望标头显示相应的排序标志符号,因此将 SortMode 属性设置为 Programmatic。设置为编程排序模式的列不会自动显示排序标志符号。对于这些列,必须通过设置 System.Windows.Forms.DataGridViewColumnHeaderCell.SortGlyphDirection 属性来手动显示标志符号。为了在自定义排序中能够灵活操作,这是必需的。例如,如果按多列对 DataGridView 排序,则可能希望显示多个排序标志符号或不显示任何标志符号。虽然可以以编程方式按任一列对 DataGridView 排序,但是一些列(如按钮列)可能不包含可以有意义地排序的值。对于这些列,NotSortable 的 SortMode 属性设置指示将永不使用这些列排序,因此不需要在标头中为标志符号保留空间。对于已排序的 DataGridView,可以通过检查 SortedColumn 和 SortOrder 属性的值确定排序列和排序顺序。这些值在自定义排序操作之后没有意义。有关自定义排序的更多信息,请参见本主题后面的“自定义排序”部分。对包含绑定列和未绑定列的 DataGridView 控件排序时,未绑定列中的值无法自动维护。若要维护这些值,必须通过将 VirtualMode 属性设置为 true 和处理 CellValueNeeded 和 CellValuePushed 事件实现虚拟模式。有关更多信息,请参见如何:在 Windows 窗体 DataGridView 控件中实现虚拟模式。在绑定模式下按未绑定列进行排序不受支持。以编程方式进行排序
    可以通过调用 DataGridView 的 Sort 方法以编程方式对其排序。 Sort 方法的 Sort(DataGridViewColumn,ListSortDirection) 重载采用 DataGridViewColumn 和 ListSortDirection 枚举值作为参数。当按列值可以有意义地排序(但不想将该列配置为用于自动排序)的列排序时,此重载很有用。当调用此重载并传入具有 System.Windows.Forms.DataGridViewColumnSortMode.Automatic 的 SortMode 属性值的列时,会自动设置 SortedColumn 和 SortOrder 属性并在列标头中显示相应的排序标志符号。 注意 
    当通过设置 DataSource 属性将 DataGridView 控件绑定到外部数据源时,Sort(DataGridViewColumn,ListSortDirection) 方法重载不能用于未绑定列。此外,当 VirtualMode 属性为 true 时,可以仅为绑定列调用此重载。若要确定某一列是否为数据绑定列,请检查 IsDataBound 属性值。在绑定模式下对未绑定列排序不受支持。
     自定义排序
    可以通过使用 Sort 方法的 Sort(IComparer) 重载或通过处理 SortCompare 事件来自定义 DataGridView。Sort(IComparer) 方法重载采用一个实现 IComparer 接口的类的一个实例作为参数。当希望提供自定义排序时,此重载很有用;例如,当某一列中的值没有自然排序顺序时,或者当自然排序顺序不适用时。在这种情况下,不能使用自动排序,但是可能仍然希望用户通过单击列标头进行排序。可以在 ColumnHeaderMouseClick 事件的处理程序中调用此重载,即使不使用列标头进行选择。 注意 
    仅当 DataGridView 控件未绑定到外部数据源且 VirtualMode 属性值为 false 时,Sort(IComparer) 方法重载才起作用。若要为绑定到外部数据源的列自定义排序,必须使用由该数据源提供的排序操作。在虚拟模式中,必须为未绑定列提供您自己的排序操作。
     若要使用 Sort(IComparer) 方法重载,必须创建您自己的类,该类实现 IComparer 接口。此接口要求您的类实现 System.Collections.IComparer.Compare(System.Object,System.Object) 方法,在调用 Sort(IComparer) 方法重载时,DataGridView 将 DataGridViewRow 对象作为输入传给该方法。使用此方法,您可以基于任一列中的值计算正确的行排序。Sort(IComparer) 方法重载不设置 SortedColumn 和 SortOrder 属性,因此必须总是设置 System.Windows.Forms.DataGridViewColumnHeaderCell.SortGlyphDirection 属性以显示排序标志符号。 作为 Sort(IComparer) 方法重载的一个替代方法,可以通过为 SortCompare 事件实现处理程序来提供自定义排序。当用户单击为自动排序配置的列的标头时,或者当调用 Sort 方法的 Sort(DataGridViewColumn,ListSortDirection) 重载时,将发生此事件。对控件中的每对行均发生该事件,这使您能够计算它们的正确顺序。 注意 
    当 DataSource 属性已设置时,或者当 VirtualMode 属性值为 true 时,不会发生 SortCompare 事件。
     
      

  2.   

    private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
            {
                //e.CellValue1
                //e.CellValue2
                //这两个是object,根据实际情况进行类型转换,再比较,结果赋给e.SortResult。
                //e.SortResult的值的含义,可以查一下msdn。            if ((int)e.CellValue1 < (int)e.CellValue2)
                {
                    e.SortResult = -1;
                }
                else if ((int)e.CellValue1 == (int)e.CellValue2)
                {
                    e.SortResult = 0;
                }
                else
                {
                    e.SortResult = 1;
                }
                e.Handled = true;
                
            }
      

  3.   

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;namespace CommonLib
    {
        public class DataGridViewColumnSorter : IComparer
        {
            /// <summary>
            /// 指定按照哪个列排序
            /// </summary>
            private int ColumnToSort;
            /// <summary>
            /// 指定排序的方式
            /// </summary>
            private SortOrder OrderOfSort;
            /// <summary>
            /// 声明CaseInsensitiveComparer类对象,
            /// 参见ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemCollectionsCaseInsensitiveComparerClassTopic.htm
            /// </summary>
            private CaseInsensitiveComparer ObjectCompare;        /// <summary>
            /// 构造函数
            /// </summary>
            public DataGridViewColumnSorter()
            {
                // 默认按第一列排序
                ColumnToSort = 0;            // 排序方式为不排序
                OrderOfSort = SortOrder.None;            // 初始化CaseInsensitiveComparer类对象
                ObjectCompare = new CaseInsensitiveComparer();
            }        /// <summary>
            /// 重写IComparer接口.
            /// </summary>
            /// <param name="x">要比较的第一个对象</param>
            /// <param name="y">要比较的第二个对象</param>
            /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
            public int Compare(object x, object y)
            {
                int compareResult;
                DataGridViewRow dataGridViewRowX, dataGridViewRowY;            // 将比较对象转换为DataGridViewRow对象
                dataGridViewRowX = (DataGridViewRow)x;
                dataGridViewRowY = (DataGridViewRow)y;            // 比较
                compareResult = ObjectCompare.Compare(dataGridViewRowX.Cells[ColumnToSort].Tag, dataGridViewRowY.Cells[ColumnToSort].Tag);            // 根据上面的比较结果返回正确的比较结果
                if (OrderOfSort == SortOrder.Ascending)
                {
                    // 因为是正序排序,所以直接返回结果
                    return compareResult;
                }
                else if (OrderOfSort == SortOrder.Descending)
                {
                    // 如果是反序排序,所以要取负值再返回
                    return (-compareResult);
                }
                else
                {
                    // 如果相等返回0
                    return 0;
                }
            }        /// <summary>
            /// 获取或设置按照哪一列排序.
            /// </summary>
            public int SortColumn
            {
                set
                {
                    ColumnToSort = value;
                }
                get
                {
                    return ColumnToSort;
                }
            }        /// <summary>
            /// 获取或设置排序方式.
            /// </summary>
            public SortOrder Order
            {
                set
                {
                    OrderOfSort = value;
                }
                get
                {
                    return OrderOfSort;
                }
            }    }}
      

  4.   

      to @flancfly你这个类要怎么调用啊?