繁体   English   中英

Winform DatagridView数字列排序

[英]Winform DatagridView Numeric Column Sorting

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

任何帮助将非常感激。

您可以通过使用以下代码在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),这就是我对列索引进行检查的原因。

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

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

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

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

您也可以使用格式化列

dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;

数值类型具有内置的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的类型。

您的数据库列类型应该是int或double或float,而不是varchar或者其他....所以你必须在数据库中更改你的值类型...你不需要编写任何代码或者当你点击时直接排序的东西在标题栏上.​​..

您的问题是datagridview按字符串排序。 将该单元格复制到datagrid时,尝试将stringfloat

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM