Winform DatagridView数字列排序

时间:2010-01-07 04:54:02

标签: c# winforms datagridview

我只使用一个简单的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上使用的“排序”方法。但是解释有点过头了,示例没有使用数字,只有文字,所以我无法看到我应该如何切换。

非常感谢任何帮助。

6 个答案:

答案 0 :(得分: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;
   }
}

在MSDN中有SortResult值的描述:

  

如果第一个单元格将小于零   在第二个小区之前排序;零   如果第一个细胞和第二个细胞有   等价值;大于零   如果第二个单元格将被排序   在第一个细胞之前。

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

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

您可能已经看过它,但是here是自定义DataGridView排序的MSDN页面的链接。如你所说,他们只处理文字。

答案 1 :(得分:6)

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

dataGridView1.Columns[int index].ValueType = typeof(double);

您也可以使用

格式化列
dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;

答案 2 :(得分:1)

数字类型具有内置的CompareTo函数,可用作SortCompare事件的SortResult。

    private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
    {
        if (e.Column.Index == 0)
        {
            e.SortResult = int.Parse(e.CellValue1.ToString()).CompareTo(int.Parse(e.CellValue2.ToString()));
            e.Handled = true;
        }
    }

这当然是假设您知道DataGridView中的类型。

答案 3 :(得分:1)

您的数据库列类型应为int或double或float,而不是varchar或者其他内容.... 所以你必须在数据库中更改你的值类型...... 当您单击Header ...

列时,您无需编写任何代码或其直接排序的内容

答案 4 :(得分:0)

按字符排序。您需要使列类型为float,以便它知道要应用的比较运算符。

(那就是你需要让你的数据集中的列类型浮动,我相信它会起作用。)

答案 5 :(得分:0)

您的问题是datagridview按字符串排序。将该单元格复制到string时,请尝试将float转换为datagrid