Winform DatagridView数字列排序

Min*_*ata 8 c# datagridview winforms

我只使用一个简单的DataGridView来保存一堆数据(搞笑).

我在特定列中有小数.但是当按照那个十进制列排序时,它会错误地命令它.例如 :

开始订单可能是:

  • 0.56
  • 3.45
  • 500.89
  • 20078.90
  • 1.56
  • 100.29
  • 2.39

结束顺序是:

  • 0.56
  • 100.29
  • 1.56
  • 20078.90
  • 2.39
  • 3.45
  • 500.89

如您所见,它从第一个数字开始对其进行排序.然后以这种方式命令它.

我想可能我可以将列设置为不同的"ColumnType",并且可以自动执行此操作.但是没有"数字"或"十进制"列类型.

我在MSDN上查找问题,我可以找到可以在DataGridView上使用的"排序"方法.但是解释有点过头了,示例没有使用数字,只有文字,所以我无法看到我应该如何切换.

任何帮助将非常感激.

Dav*_*all 8

您可以通过使用以下代码在DataGridView上为SortCompare事件添加处理程序来解决此问题:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.Column.Index == 0)
    {
        if (double.Parse(e.CellValue1.ToString()) > double.Parse(e.CellValue2.ToString()))
        {
            e.SortResult = 1;
        }
        else if (double.Parse(e.CellValue1.ToString()) < double.Parse(e.CellValue2.ToString()))
        {
            e.SortResult = -1;
        }             
        else
        {
            e.SortResult = 0;
        }
        e.Handled = true;
   }
}
Run Code Online (Sandbox Code Playgroud)

从MSDN有SortResult值的这种描述:

如果第一个单元格将在第二个单元格之前排序,则小于零; 如果第一个单元格和第二个单元格具有等效值,则为零 如果第二个单元格将在第一个单元格之前排序,则大于零.

请注意,在我的测试床中,唯一的数字列是第一列(索引为0),这就是我对列索引进行检查的原因.

此外,根据您的需求和数据,您可能需要优化我的代码 - 例如,如果由于某种原因您的列中包含非数字数据,我的代码将抛出异常.

您可能已经看过了,但这里有一个指向MSDN页面的链接,用于自定义DataGridView排序.如你所说,他们只处理文本.


Kev*_*ski 6

我有同样的问题.我尝试使用David Hall提到的事件处理程序.我在定义DataGridView时使用了ValueType属性.它现在作为双精度排序,不需要自定义事件处理程序代码

dataGridView1.Columns[int index].ValueType = typeof(double);
Run Code Online (Sandbox Code Playgroud)

您也可以使用格式化列

dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;
Run Code Online (Sandbox Code Playgroud)