【问题标题】:.NET WinForms DataGridView C# SortCompare apparently ignoring results.NET WinForms DataGridView C# SortCompare 显然忽略了结果
【发布时间】:2017-10-31 16:01:51
【问题描述】:

我试图实现一个通用的 SortCompare 事件处理程序,用于我的(未绑定的)DataGridView 控件上的任何列。所有单元格数据都写为字符串,但实际上其中一些用作整数(即 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 是 Automatic。只是结果似乎是按字符串排序的。

也许我的 DataGridView 中没有正确配置某些内容?

【问题讨论】:

  • 并不奇怪。字符串不是数字。当您尝试将数字作为字符串排序时,您会得到一个词法比较,其中"9" 的排序将高于"100",因为"9" > "1"。这里有几种很好的自然排序方法,但是尝试将数字作为字符串进行比较并不是一个好主意

标签: c# .net winforms datagridview


【解决方案1】:

我猜在进行 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”……这不是一个好主意。

【讨论】:

  • 宾果游戏!它所需要的只是“e.Handled = true;”谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多