c# datagridview点击列头排序改为以数值大小排序

具体细看MSDN的

DataGridViewSortCompareEventArgs. SortResult 属性
如何:自定义 Windows 窗体 DataGridView 控件中的排序方式

 

 

 可以直接使用下面代码

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
        {
            e.SortResult = (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) > 0) ? 1 : (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) < 0)?-1:0;
            e.Handled = true;//不能省掉,不然没效果
        }

 1.在使用 DataGridView时,对于数值列,默认的排序方式仍然是按照字符串方式进行
如果需要按照数值型进行排序,有几种办法,其中一种就是重载SortCompare方法
//重载_SortCompare方法
        private void DataGridView1_SortCompare(object sender,DataGridViewSortCompareEventArgs e)
        {
            //   如果是学号或成绩列,则按浮点数处理
            if(e.Column.Name=="学号"|| e.Column.Name=="成绩")
            {
                e.SortResult = (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) > 0) ? 1 : (Convert.ToDouble(e.CellValue1) - Convert.ToDouble(e.CellValue2) < 0)?-1:0;
            }
            //否则,按字符串比较
            else
            {
                e.SortResult = System.String.Compare(Convert.ToString(e.CellValue1), Convert.ToString(e.CellValue2));
            }
           
            // 如果发现两行相同,则按学号排序  
            if (e.SortResult == 0 && e.Column.Name != "学号")
            {
                e.SortResult = Convert.ToInt32(DataGridView1.Rows[e.RowIndex1].Cells["学号"].Value.ToString()) -
                        Convert.ToInt32(DataGridView1.Rows[e.RowIndex2].Cells["学号"].Value.ToString());
            }
            e.Handled = true;//不能省掉,不然没效果
        }  


2.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 事件
--------------------- 
版权声明:本文为CSDN博主「lcawen」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lcawen88/article/details/8544599

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值