.NET WinForms DataGridView C#SortCompare显然忽略了结果

时间:2017-10-31 16:01:52

标签: c# .net winforms datagridview

我试图在我的(未绑定的)DataGridView控件上的任何列上实现一个通用的SortCompare事件处理程序。所有单元格数据都写为字符串,但实际上它们中的一些用作整数(即int.TryParse将返回true)。目的是如果发现数据是整数,那么它们将被比较为整数,否则字符串比较将被用作回退。

问题在于,在一个特定列上,所有单元格的数据都是空字符串或可转换为int的字符串,结果似乎已被排序为字符串(例如“13”,“135”,“1350” ,“14”,“149”,“15”)而不是整数(例如13,14,15,135,149,1350)。奇异。

这是我的事件处理程序(C#):

    private void DataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
    {
        var cell1 = e.CellValue1.ToString();
        var cell2 = e.CellValue2.ToString();

        if (cell1 == cell2)
        {
            e.SortResult = 0;
            return;
        }

        if (cell1 == "")
        {
            e.SortResult = -1;
            return;
        }

        if (cell2 == "")
        {
            e.SortResult = 1;
            return;
        }

        int value1, value2;
        if (int.TryParse(cell1, out value1) && int.TryParse(cell2, out value2))
            e.SortResult = value1 - value2; // Integer comparison
        else
            e.SortResult = string.Compare(cell1, cell2, StringComparison.InvariantCultureIgnoreCase); // String comparison
    }

我可以验证注释“整数比较”的行被多次命中,并且注释“字符串比较”的行永远不会被命中。事件处理程序触发似乎没有任何问题。没有异常被抛出。列的SortMode是自动的。只是结果似乎已被字符串排序。

也许在我的DataGridView中没有配置某些东西?

1 个答案:

答案 0 :(得分:0)

我猜这种排序是在你的int比较之后恢复到字符串比较。如果您指示事件已使用e.Handled = true;行处理,则您的代码将按预期工作。您是否尝试将代码行e.Handled = true;添加到代码的末尾?

下面的代码检查要排序的列是否为数字列。如果是,则按数字排序,否则按字符串值排序。希望这会有所帮助。

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) {
  if (e.Column.Name == "NumberColumn") {
    if (int.TryParse(e.CellValue1.ToString(), out int value1) && int.TryParse(e.CellValue2.ToString(), out int value2)) {
      e.SortResult = value1.CompareTo(value2);
      e.Handled = true;
    }
  }
}

另外,作为附注,您似乎已将DataGridView“DataGridView”命名为......这不是一个好主意。